欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP-FPM之Chroot執(zhí)行環(huán)境詳解

 更新時(shí)間:2015年08月03日 16:58:33   投稿:mrr  
在PHP-FPM中設(shè)立chroot,有很好的隔離作用,提高系統(tǒng)安全性,但是要想建立一個(gè)合理的PHP-FPM Chroot環(huán)境難度有點(diǎn)大,比用debootstrap等工具建立還要麻煩,這篇文章就詳細(xì)介紹了PHP-FPM之Chroot執(zhí)行環(huán)境,需要的朋友可以參考下。

在PHP-FPM中設(shè)立chroot,有很好的隔離作用,提高系統(tǒng)安全性,但是要想建立一個(gè)合理的PHP-FPM Chroot環(huán)境難度有點(diǎn)大,比用debootstrap等工具建立還要麻煩,下面通過(guò)參考相關(guān)資料,把PHP-FPM之Chroot執(zhí)行環(huán)境整理出來(lái),分享給大家。

本文以Ubuntu 14.04.2為例,php-fpm使用的是 ppa:ondrej/php5-5.6 提供的PHP5.6版本,跟系統(tǒng)自帶以及Debian系統(tǒng)的php-fpm和系統(tǒng)目錄結(jié)構(gòu)應(yīng)該是一致的。CentOS請(qǐng)自行調(diào)整。

php-fpm的chroot環(huán)境配置和所使用的服務(wù)器前端沒(méi)有關(guān)聯(lián),也不強(qiáng)求Apache/Nginx進(jìn)行chroot。當(dāng)然那樣更安全——也更復(fù)雜。

1.建立目錄結(jié)構(gòu)

chroot的目錄選擇為 /var/www/chroot ,其中頁(yè)面文件放置在 /var/www/chroot/public 。

執(zhí)行下面的命令建立基本的目錄結(jié)構(gòu):

bash
mkdir -p /var/www/chroot/
cd /var/www/chroot
mkdir -p public bin dev tmp usr/sbin/ usr/share/zoneinfo/ var/run/nscd/ var/lib/php5/sessions var/www
cp -a /dev/zero /dev/urandom /dev/null dev/ #注3
chmod --reference=/tmp tmp/
chmod --reference=/var/lib/php5/sessions var/lib/php5/sessions #注4
chown -R root:root .     #注2
chown -R www-data:www-data public/ #注2
cd var/www
ln -s ../.. chroot     #注1

下面是此時(shí)目錄結(jié)構(gòu),之后還會(huì)添加一些新的東西:

/var/www/chroot/
├── bin
├── dev
│ ├── null
│ ├── urandom
│ └── zero
├── public
├── tmp
├── usr
│ ├── sbin
│ └── share
│ └── zoneinfo
└── var
 ├── lib
 │ └── php5
 │ └── sessions
 ├── run
 │ └── nscd
 └── www
 └── chroot -> ../.. #注1

注1:這個(gè)軟連接用于解決Apache/nginx傳給php-fpm的 SCRIPT_FILENAME 在進(jìn)入chroot后找不到文件(訪問(wèn)php頁(yè)面返回"File not found")的問(wèn)題。

以nginx為例,通常設(shè)置 SCRIPT_FILENAME 為 $document_root$fastcgi_script_name ,傳給php-fpm的腳本路徑就是 /var/www/chroot/public/index.php 。而由于php-fpm處在chroot環(huán)境下,所以它實(shí)際試圖去訪問(wèn)的路徑就變成了 /var/www/chroot + /var/www/chroot/public/index.php 當(dāng)然是不存在的。

所以使用一個(gè)軟連接把chroot環(huán)境下的 /var/www/chroot 鏈接到根目錄,就能夠正常訪問(wèn)腳本了。

當(dāng)然也可以將 SCRIPT_FILENAME 設(shè)置成 /public$fastcgi_script_name 。但是這樣硬編碼不利于配置的遷移,僅能用于chroot的環(huán)境,切換回非chroot環(huán)境的話還需要修改配置。所以不建議這么做。(順便說(shuō)一句,有很多老教程里也不使用 $document_root ,直接硬編碼根目錄,當(dāng)然也是不可取的)

注2:chroot環(huán)境并不是100%安全的。由于php-fpm在chroot環(huán)境中的執(zhí)行權(quán)限是www-data,仍然建議把非必要的目錄的擁有者設(shè)置為root來(lái)減少不必要的訪問(wèn)權(quán)限。chroot不等于安全,參考 chroot最佳實(shí)踐 中列出的一些原則。從更安全的角度上講之后最好也將bin、lib、sbin等目錄的讀寫權(quán)限去掉,只留可執(zhí)行權(quán)限,不過(guò)也沒(méi)大差別了……

注3:cp -a除了拷貝文件內(nèi)容外也會(huì)復(fù)制文件的權(quán)限、模式等信息,可以很方便的直接拿來(lái)拷貝zero、urandom和null這三個(gè)關(guān)鍵的設(shè)備文件。mknod似乎是更為穩(wěn)妥的方式,不過(guò)cp -a我使用起來(lái)似乎也沒(méi)問(wèn)題。

注4:chmod --reference=XXX會(huì)參考XXX的權(quán)限設(shè)置后面的權(quán)限。tmp就不提了,關(guān)鍵是后面的 var/lib/php5/sessions 是php存放session文件的目錄,需要讓www-data有讀寫的權(quán)限。建議設(shè)置完之后再看一眼。當(dāng)然后面會(huì)有測(cè)試。

2.PHP-FPM的配置

建立一個(gè)新的php-fpm的執(zhí)行pool來(lái)搭建chroot環(huán)境。并不建議直接修改php-fpm.conf,因?yàn)檫@樣是全局生效的,如果有多個(gè)php站點(diǎn)的話會(huì)共用一套chroot環(huán)境。

其實(shí)很多php-fpm的教程都忽略了php-fpm的pool的配置,導(dǎo)致很多人一臺(tái)服務(wù)器上所有站點(diǎn)都共用一套配置,尤其是共用一套php.ini的配置,實(shí)際上是不合理的。應(yīng)當(dāng)根據(jù)站點(diǎn)的需求單獨(dú)建立pool并在其中調(diào)整參數(shù)。

在 /etc/php5/fpm/pool.d/ 下新建 chroot.conf (注意必須以.conf結(jié)尾,才能被php-fpm.conf調(diào)用):

[chroot]
user = www-data
group = www-data
listen = /var/run/php-chroot.sock
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3

chroot = /var/www/chroot
chdir = /public
;security.limit_extensions = .php
php_flag[display_errors] = on
php_value[date.timezone] = Asia/Hong_Kong
;php_admin_value[session.gc_probability] = 1
;php_admin_value[open_basedir] = "/tmp/:/public/:/var/www/chroot/public/"

前面的參數(shù)都比較熟悉了。只需要簡(jiǎn)單的設(shè)置chroot為配置好的環(huán)境根目錄就可以開(kāi)啟chroot了。通過(guò)執(zhí)行 php5-fpm -t 測(cè)試一下之后,用 service php5-fpm reload 即可啟用新的pool。當(dāng)然Apache/nginx對(duì)應(yīng)的配置中要設(shè)置好后端。

提一下最后幾行。倒數(shù)第四行打開(kāi)了 display_errors ,以便之后對(duì)chroot下的php的功能進(jìn)行測(cè)試,測(cè)試完了記得注釋掉。

設(shè)置 session.gc_probability 允許php進(jìn)程自行對(duì)session進(jìn)行刪除回收。正常情況下session是由php添加的cron任務(wù)清理的,但是似乎php不會(huì)自動(dòng)清理chroot環(huán)境下的session。當(dāng)然也可以自己在cron.d下添加自動(dòng)執(zhí)行的腳本來(lái)清理,就不用開(kāi)啟這個(gè)選項(xiàng)了。

3.修復(fù)Chroot環(huán)境下PHP的各項(xiàng)功能

在/var/www/chroot/public下新建一個(gè)test.php,寫入以下內(nèi)容:

復(fù)制代碼 代碼如下:

php
<?php
session_start();
header( "Content-Type: text/plain" );
echo( gethostbyname( "localhost" )."\n" );
print_r( getdate() );
mail( "your@address", "subject", "message" );

這里主要測(cè)試的功能是:session、DNS解析、時(shí)間和日期、郵件mail()函數(shù)。

訪問(wèn)上面的測(cè)試頁(yè)面,提示No such directory or file或者Permission denied說(shuō)明session配置不正確。 gethostbyname 返回的不是127.0.0.1或者::1,則說(shuō)明DNS解析沒(méi)有生效。提示 timezone database is corrupt 之類的,說(shuō)明時(shí)間和日期有錯(cuò)誤。mail()也會(huì)有各種錯(cuò)誤提示。

session就不提了,設(shè)置好目錄權(quán)限就沒(méi)有問(wèn)題。主要處理一下后面三個(gè)問(wèn)題,也是php的chroot環(huán)境主要需要處理的內(nèi)容。

3.1 域名解析/時(shí)區(qū)等問(wèn)題

mail()的解決方法大同小異,放后面談。前面的域名解析等問(wèn)題這里我介紹兩種解決方法。方法1是參考Kienzl的簡(jiǎn)便方法,方法2是大部分教程采用的方法。

方法1:使用nscd

nscd是(e)glibc的“Name Service Caching Daemon”。除了處理gethostbyname()這樣的函數(shù)外,也處理getpwnam()等需要訪問(wèn)/etc/passwd的函數(shù)。(e)glibc訪問(wèn)nscd的unix socket, /var/run/nscd/socket 來(lái)通過(guò)nscd獲取這些內(nèi)容,如果不能連接到nscd則轉(zhuǎn)而自行進(jìn)行解析。

也就是說(shuō),只要裝好nscd,并且讓chroot環(huán)境里的程序能夠訪問(wèn)到socket連接上nscd,就可以把chroot環(huán)境內(nèi)的解析請(qǐng)求轉(zhuǎn)由chroot外順利進(jìn)行了。由于/var/run一般是tmpfs,硬鏈接無(wú)法跨文件系統(tǒng)使用,所以可以使用 mount -bind 來(lái)把/var/run/nscd目錄mount到chroot環(huán)境中同樣的位置去即可。

同樣的道理,用 mount -bind 把/usr/share/zoneinfo目錄mount到chroot環(huán)境里,配合在php-fpm的pool里設(shè)置date.timezone就可以非常直接而暴力的解決時(shí)區(qū)問(wèn)題。

先執(zhí)行 apt-get install nscd 安裝nscd,然后為了能夠讓 mount -bind 自動(dòng)執(zhí)行,把下面的腳本存為 /etc/init.d/php-chroot

bash
#!/bin/sh
### BEGIN INIT INFO
# Provides:  php5-fpm-chroot-setup
# Required-Start: nscd
# Required-Stop:
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Bind-mounts needed sockets and data into a php-fpm-chroot
### END INIT INFO
CHROOT=/var/www/chroot
DIRS="/var/run/nscd /usr/share/zoneinfo"
case "$1" in
 start)
 $0 stop 2>/dev/null
 for d in $DIRS; do
  mkdir -p "${CHROOT}$vvxyksv9kd"
  mount --bind -o ro "$vvxyksv9kd" "${CHROOT}$vvxyksv9kd"
 done
 ;; 
 stop) 
 for d in $DIRS; do
  umount "${CHROOT}$vvxyksv9kd"
 done
 ;; 
 *)
 echo "Usage: $N {start|stop}" >&2
 exit 1
 ;;
esac
exit 0

執(zhí)行 update-rc.d php-chroot defaults 來(lái)讓腳本在啟動(dòng)時(shí)執(zhí)行。如果有多個(gè)chroot環(huán)境以及多個(gè)目錄需要bind-mount,可以自行添加一個(gè)循環(huán)改寫。

這個(gè)方法的好處是簡(jiǎn)單易行,不需要拷貝大量etc下的配置文件和庫(kù)文件到chroot環(huán)境中。使用nscd在解決域名訪問(wèn)的問(wèn)題過(guò)程中也順道解決了/etc/passwd和/etc/group。但是bind-mount和nscd的安全性尚沒(méi)有確切的說(shuō)法,只能說(shuō)so far so good。另外 mount -bind 會(huì)消耗一定的系統(tǒng)資源,有評(píng)論稱大約一個(gè)mount 大概會(huì)消耗500k內(nèi)存,所以對(duì)于大量的chroot環(huán)境(幾百個(gè))不見(jiàn)得適合。

方法2:拷貝/etc配置文件和庫(kù)文件

這是最傳統(tǒng)而常用的方法,也相對(duì)比較復(fù)雜。到底拷貝哪些配置、哪些庫(kù)文件因發(fā)行版和軟件版本而異,很難有定論也不好調(diào)試。而且一旦系統(tǒng)升級(jí),對(duì)應(yīng)的庫(kù)文件也需要進(jìn)行更新,工作量很大。我沒(méi)有采用這個(gè)方法,但是簡(jiǎn)要的介紹一些比較靠譜的方法分享一下。

域名解析。需要拷貝/etc/resolv.conf,/etc/hosts,/etc/nsswitch.conf到chroot環(huán)境下的etc目錄下。還需要拷貝一系列的庫(kù)文件,主要是libnss_*.so,libresolv.so,libsoftokn3.so。具體libnss_*.so拷貝哪些,可以打開(kāi)nsswitch.conf看列出了哪些。

時(shí)區(qū)配置??截?etc/localtime,/usr/share/zoneinfo/zone.tab,和/usr/share/zoneinfo目錄下所使用時(shí)區(qū)的文件。

其它常用配置。/etc/passwd和/etc/group有時(shí)也是需要的,但是內(nèi)容 似乎可以偽造 ,至少可以選擇性的填寫不用完全拷貝主系統(tǒng)里的。

如果使用的時(shí)候仍然出現(xiàn)問(wèn)題,可以使用strace來(lái)查看php進(jìn)行了哪些調(diào)用使用了哪些庫(kù)文件。先執(zhí)行:

復(fù)制代碼 代碼如下:

bash
ps aux | grep php | grep 'chroot' #chroot是php的pool名

查看pool的進(jìn)程pid(可以在pool設(shè)置里先把子進(jìn)程數(shù)目限制到1個(gè)方便調(diào)試)。然后執(zhí)行:

bash
strace -p 進(jìn)程pid -o chroot1.txt&  #有多個(gè)子進(jìn)程就修改pid執(zhí)行多次,輸出改為chroot2/3.txt存到不同文件里
此時(shí)在頁(yè)面里執(zhí)行各種函數(shù),然后查看輸出文件里記錄了哪些庫(kù)文件,對(duì)應(yīng)拷貝到chroot環(huán)境里即可。

這個(gè)方法很麻煩,尤其是第一次安裝設(shè)置和后續(xù)系統(tǒng)更新時(shí)。當(dāng)然身為運(yùn)維人員寫寫shell腳本簡(jiǎn)化工作肯定是基本功了。這種方法沒(méi)有額外的內(nèi)存消耗,可以部署大量chroot環(huán)境,當(dāng)然硬盤消耗會(huì)高一點(diǎn),而且安全性也經(jīng)歷了長(zhǎng)久的考驗(yàn)

3.2 修復(fù)mail()

如果是使用WordPress,也可以利用MailChimp等插件不使用系統(tǒng)自身的郵件服務(wù)。事實(shí)上因?yàn)槔]件的標(biāo)準(zhǔn)日益嚴(yán)格,和VPS主機(jī)商的限制,我現(xiàn)在更傾向于干脆不在系統(tǒng)里部署郵件服務(wù)了,所以php的mail()函數(shù)算是被廢掉了……當(dāng)然如果需要的話也可以很簡(jiǎn)單的設(shè)置好的。

php的mail()函數(shù)是使用system()調(diào)用sendmail進(jìn)行郵件發(fā)送操作,所以需要chroot環(huán)境里有能夠調(diào)用的sendmail程序即可。常見(jiàn)的替代品是mini_sendmail,這里多介紹ssmtp,msmtp也類似。

前提:處理/bin/sh

system()調(diào)用產(chǎn)生的命令行是 /bin/sh -c command 。在chroot環(huán)境中調(diào)用外部程序必須存在/bin/sh,一個(gè)基本的shell。通常選擇拷貝dash:

復(fù)制代碼 代碼如下:

bash
#cp /bin/dash /var/www/chroot/bin/sh

注意運(yùn)行 ldd /bin/dash 觀察需要拷貝哪些庫(kù)文件。我這里的回顯是:

復(fù)制代碼 代碼如下:

bash
ldd /bin/dash
    linux-vdso.so.1 =>  (0x00007fff779fe000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f165620f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f16567fc000)

第一條那個(gè)只列了個(gè)文件名,=>后面也沒(méi)有文件的基本上都是不用管的。剩下的庫(kù)文件基本的原則是如果列出的是/lib64,就拷貝到chroot環(huán)境下的/lib64,如果列出的是/lib,雖然有很多發(fā)行版,大部分庫(kù)文件包括libc.so是在/lib/x86_64-linux-gnu/目錄下的,也直接拷貝到chroot環(huán)境的/lib目錄下即可,是可以正常找到的。

但是!

前面那句 “必須存在/bin/sh,一個(gè)基本的shell” 其實(shí)并不是真的,對(duì)于mail()只要有一個(gè)能接受-c參數(shù)調(diào)用后面的命令的程序就可以了。所以Kienzl寫了這樣一個(gè)程序:

c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MAXARG 64
int main( int argc, char* const argv[] ) {
 char* args[ MAXARG ] = {};
 if( argc < 3 || strcmp( argv[1], "-c" ) != 0 ) {
 fprintf( stderr, "Usage: %s -c <cmd>\n", argv[0] ); 
 return 1;
 }
 {
 char* token;
 int i = 0; 
 char* argStr = strdup( argv[2] );
 while( ( token = strsep( &argStr, " " ) ) != NULL ) {
  if( token && strlen( token ) )
  args[ i++ ] = token;
  if( i >= MAXARG )
  return 2;
 }
 } 
 return execvp( args[0], args );
}

保存成sh.c執(zhí)行: gcc sh.c -o sh -static 然后把sh拷貝到chroot環(huán)境的/bin目錄下即可。

這樣一個(gè)不完全的shell從一定程度上也算是增強(qiáng)了chroot環(huán)境的安全性了。

方法1:使用mini_sendmail

mini_sendmail似乎專為chroot環(huán)境而生。調(diào)用mini_sendmail后,它會(huì)轉(zhuǎn)而訪問(wèn)本機(jī)的25端口,通過(guò)本機(jī)的郵件服務(wù)來(lái)發(fā)送郵件。所以如果主環(huán)境有安裝postfix/exim4等郵件服務(wù)的話可以使用mini_sendmail來(lái)在chroot環(huán)境中發(fā)送郵件,這是最簡(jiǎn)單的方法。

mini_sendmail的安裝很簡(jiǎn)單:

復(fù)制代碼 代碼如下:

bash
wget http://www.acme.com/software/mini_sendmail/mini_sendmail-1.3.8.tar.gz
tar zxf mini_sendmail-1.3.8.tar.gz
cd mini_sendmail-1.3.8
make
cp mini_sendmail /var/www/chroot/usr/sbin/sendmail

最后一行自行修改chroot環(huán)境的目錄。切記要拷貝到chroot環(huán)境的/usr/sbin目錄下并且命名為sendmail。否則的話要在pool里自行設(shè)置ini參數(shù)的sendmail_path來(lái)指導(dǎo)php找到sendmail程序。

由于mini_sendmail默認(rèn)就是靜態(tài)鏈接,所以也無(wú)需拷貝其它的庫(kù)文件了。

方法2:使用ssmtp/msmtp

對(duì)于本機(jī)沒(méi)有安裝郵件服務(wù)的情況,就不能使用mini_sendmail了。ssmtp和msmtp都支持把接收到的郵件發(fā)送請(qǐng)求轉(zhuǎn)而通過(guò)其它SMTP服務(wù)器來(lái)發(fā)送。需要注意的是由于ssl支持需要更多更復(fù)雜的庫(kù)文件和配置,所以不建議為兩者編譯ssl支持……下面以ssmtp為例介紹一下。

bash
wget ftp://ftp.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.64.orig.tar.bz2
tar jxf ssmtp_2.64.orig.tar.bz2
cd ssmtp_2.64
./configure --prefix=/ #別忘了prefix
make     #千萬(wàn)別手抖make install
cp ssmtp /var/www/chroot/usr/sbin
mkdir -p /var/www/chroot/etc/ssmtp
cp ssmtp.conf revaliases /var/www/chroot/etc/ssmtp #配置文件
cd /var/www/chroot/usr/sbin
ln -s ssmtp sendmail

同樣記得ldd然后把對(duì)應(yīng)的庫(kù)文件拷貝過(guò)去。另外ssmtp需要/etc/passwd和/etc/group,如果上面沒(méi)有使用nscd需要拷貝/偽造這兩個(gè)文件。

ssmtp需要配置。ssmtp.conf文件配置如下:

bash
root=admin@example.com  #其實(shí)這行好像可以亂寫

mailhub=smtp.example.com  #smtp服務(wù)器地址
hostname=myexample.com  #此處的hostname似乎會(huì)用于產(chǎn)生默認(rèn)的“root@myexample.com”形式的發(fā)件人地址
AuthUser=admin@example.com #此處使用真實(shí)的登錄用戶名
AuthPass=password   #密碼
FromLineOverride=YES   #允許改寫發(fā)件人

revaliases里配置每個(gè)用戶在使用ssmtp時(shí)使用的“發(fā)件人”地址和smtp服務(wù)器地址??梢圆慌渲茫俏募?。具體格式是:

復(fù)制代碼 代碼如下:

bash
# 本地用戶名:發(fā)件人地址:smtp服務(wù)器[:端口(默認(rèn)25)]
root:admin@example.com:smtp.example.com
www-data:noreply@example.com:smtp.example.com

可以使用chroot(指真正的chroot命令)做個(gè)測(cè)試:

復(fù)制代碼 代碼如下:

bash
chroot /var/www/chroot /bin/sh             #此時(shí)/bin/sh一定要是真正的shell
echo "Subject: test"|sendmail -v username@server.com  #替換郵件地址為自己的

此時(shí)php的mail()函數(shù)應(yīng)該就可用了。

4.其它問(wèn)題

配置完chroot環(huán)境后記得將php的pool設(shè)置里display_error關(guān)閉。
MySQL的連接可能會(huì)遇到問(wèn)題 ,因?yàn)槿绻顚憀ocalhost的話php會(huì)試圖尋找MySQL的unix socket來(lái)訪問(wèn)mysqld。填寫127.0.0.1通過(guò)TCP連接就沒(méi)有問(wèn)題了
完成后的目錄結(jié)構(gòu),以我為例給大家參考一下:

/var/www/chroot/
├── bin
│ └── sh
├── dev
│ ├── null
│ ├── urandom
│ └── zero
├── etc
│ └── ssmtp
│ ├── revaliases
│ └── ssmtp.conf
├── lib
│ └── libc.so.6
├── lib64
│ └── ld-linux-x86-64.so.2
├── public
├── tmp
├── usr
│ ├── sbin
│ │ ├── sendmail -> ssmtp
| │ └── ssmtp
│ └── share
│ └── zoneinfo
│  ├── 大量時(shí)區(qū)的目錄結(jié)構(gòu)
│  └── zone.tab
└── var
 ├── lib
 │ └── php5
 │ └── sessions
 ├── run
 │ └── nscd
 │ ├── nscd.pid
 │ └── socket
 └── www
 └── chroot -> ../..

以上就是本文的全部?jī)?nèi)容,希望大家喜歡。

相關(guān)文章

  • laravel返回統(tǒng)一格式錯(cuò)誤碼問(wèn)題

    laravel返回統(tǒng)一格式錯(cuò)誤碼問(wèn)題

    在使用yii和laravel的過(guò)程中,兩個(gè)框架對(duì)web-api都非常友好,也都對(duì)restful做了不同程度的支持,但是還是遇到了一些問(wèn)題,下面以laravel6.4為例,簡(jiǎn)單描述下我遇到的問(wèn)題,需要的朋友參考下吧
    2019-11-11
  • php實(shí)現(xiàn)的短網(wǎng)址算法分享

    php實(shí)現(xiàn)的短網(wǎng)址算法分享

    這篇文章主要介紹了php實(shí)現(xiàn)的短網(wǎng)址算法,理論上支持1,073,741,824個(gè)短網(wǎng)址,個(gè)人使用足夠了,需要的朋友可以參考下
    2014-06-06
  • laravel中命名路由的使用方法

    laravel中命名路由的使用方法

    這篇文章主要介紹了laravel中命名路由的使用方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • Zend Framework教程之Zend_Db_Table_Row用法實(shí)例分析

    Zend Framework教程之Zend_Db_Table_Row用法實(shí)例分析

    這篇文章主要介紹了Zend Framework教程之Zend_Db_Table_Row用法,詳細(xì)講述了Zend_Db_Table_Row的功能,并結(jié)合實(shí)例形式詳細(xì)分析了Zend_Db_Table_Row操作數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • function.inc.php超越php

    function.inc.php超越php

    function.inc.php超越php...
    2006-12-12
  • php二分查找二種實(shí)現(xiàn)示例

    php二分查找二種實(shí)現(xiàn)示例

    這篇文章主要介紹了php二分查找的二種實(shí)現(xiàn)示例,遞歸解法二分查找和非遞歸算法二分查找的示例,需要的朋友可以參考下
    2014-03-03
  • 百度實(shí)時(shí)推送api接口應(yīng)用示例

    百度實(shí)時(shí)推送api接口應(yīng)用示例

    這篇文章主要介紹了百度實(shí)時(shí)推送api接口應(yīng)用示例,非常的實(shí)用,有需要的朋友可以參考下
    2014-10-10
  • Thinkphp連表查詢及數(shù)據(jù)導(dǎo)出方法示例

    Thinkphp連表查詢及數(shù)據(jù)導(dǎo)出方法示例

    這篇文章主要介紹了Thinkphp連表查詢及數(shù)據(jù)導(dǎo)出方法,結(jié)合實(shí)例形式分析了thinkPHP連表查詢的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2016-10-10
  • PHP實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    PHP實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 如何通過(guò)Linux命令行使用和運(yùn)行PHP腳本

    如何通過(guò)Linux命令行使用和運(yùn)行PHP腳本

    這篇文章主要介紹了如何通過(guò)Linux命令行使用和運(yùn)行PHP腳本,PHP語(yǔ)言和C/Java以及嗲有一些PHP特性的Perl變成語(yǔ)言中的語(yǔ)法非常相似,當(dāng)前比較穩(wěn)定且最新的版本是5.6.10。PHP是一種HTML的嵌入腳本,很方便開(kāi)發(fā)人員寫出動(dòng)態(tài)生成的頁(yè)面,需要的朋友可以參考下
    2015-07-07

最新評(píng)論