1. 提高PHP的運行效率
PHP的優點之一是速度很快,對於一般的網站應用程式,可以說是已經足夠了。不過如果網站的訪問量很高、頻寬窄或者其它的因素令伺服器產生效能瓶頸的時候,你可能得想想其它的辦法來進一步提高PHP的速度了。
1.1. 代碼最佳化
1、用i+=1代替i=i+1。符合c/c++的習慣,效率還高。
2、儘可能的使用PHP內建函式。自己編寫函數之前要詳細查閱手冊,看有沒有相關的函數,否則費力不討好。
3、能使用單引號字串盡量使用單引號字串。單引號字串的效率要高於雙引號字串。
4、用foreach代替while遍曆數組。遍曆數組時foreach的效率明顯高於while迴圈,而且不需要調用reset函數。兩種遍曆方法如下:
程式1:
複製代碼 代碼如下:
reset ($arr);
while (list($key, $value) = each ($arr)) {
echo "Key: $key; Value: $value\n";
}
程式2:
複製代碼 代碼如下:
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value\n";
}
1.2. 壓縮頁面
HTTP1.1協議支援頁面壓縮傳送,也就是說伺服器把一個頁面壓縮傳送到用戶端,然後在用戶端將頁面解壓縮再顯示給客戶。在伺服器端有兩種傳輸方式,一種是頁面事先已經壓縮好了,傳送時只要將壓縮頁面傳送到用戶端就行,這種適用於靜態網頁多的情況,但是對於大多數網站,動態網頁面比較多,這種方法不太適合,因為很多傳到用戶端的頁面其實是沒有的,是伺服器接到用戶端使用者請求動態產生的,所以就要求每產生一個動態網頁面都要在傳到用戶端以前先打包壓縮。從PHP的4.0.4版以後,可以在php.ini檔案中增加一行配置“output_handler = ob_gzhandler”,這樣每個動態產生的頁面在傳送到用戶端之前都會進行壓縮,但是根據PHP官方網站的說明,這個參數不能與“zlib.output_compression = on”參數同時使用,因為容易引起PHP工作不正常,另外它只能壓縮PHP程式的動態產生的頁面,對於大量的靜態頁面尤其是影像檔就不行了。但是mod_gzip模組為Apahe提供了將靜態頁面在傳給用戶端以前先壓縮的功能,它的壓縮比最大能到10,一般情況下可以到 3,也就是說網站的傳輸速率一下提高了三倍多。要使用mod_gzip還要對Apache進行相應的配置,需要在httpd.conf檔案中加入一些參數:
複製代碼 代碼如下:
mod_gzip_on Yes(模組是否生效)
mod_gzip_minimum_file_size 1002(最小壓縮檔大小)
mod_gzip_maximum_file_size 0(最大壓縮檔大小,0表示沒有限制)
mod_gzip_maximum_inmem_size 60000(最大可佔用記憶體)
mod_gzip_item_include file "..gif102SINA>DOUBLE_QUOTATION (以gif結尾的檔案要壓縮傳送)
mod_gzip_item_include file ".txt102SINA>DOUBLE_QUOTATION
mod_gzip_item_include file ".html102SINA>DOUBLE_QUOTATION
mod_gzip_item_exclude file ".css102SINA>DOUBLE_QUOTATION
1.3. 檔案快取
這種方法通常是針對PHP、PERL等CGI程式而言的,因為這些程式有一個共同的特徵就是接到使用者的請求後不是馬上將結果返回給使用者,而是經過解譯器解釋執行後將執行結果返回給客戶,這期間通常都要涉及到資料庫的訪問。這樣就會出現一個問題,當兩個使用者訪問同一個頁面時,系統將分別對兩個請求進行操作,但事實上這兩個操作可能是一模一樣的,這樣無形當中增加了系統的負擔。所以通常的解決辦法是在系統記憶體中開闢出一段空間,當使用者第一次訪問頁面後將執行結果存放在該記憶體中,當有使用者再一次訪問該頁面時,系統就將頁面直接從記憶體中調出而不需要重新解釋執行,這段記憶體空間就叫緩衝。目前流行的緩衝管理程式是Zend Technologies公司的Zend Cache。
2. 執行系統外部命令
PHP作為一種伺服器端的指令碼語言,象編寫簡單,或者是複雜的動態網頁這樣的任務,它完全能夠勝任。但事情不總是如此,有時為了實現某個功能,必須藉助於作業系統的外部程式(或者稱之為命令),這樣可以做到事半功倍。
在PHP中調用外部命令,可以用如下三種方法來實現:
2.1. 用PHP提供的專門函數
PHP提供共了3個專門的執行外部命令的函數:system(),exec(),passthru()。
system()
原型:string system (string command [, int return_var])
system()函數很其它語言中的差不多,它執行給定的命令,輸出和返回結果。第二個參數是可選的,用來得到命令執行後的狀態代碼。
例子:
system("/usr/local/bin/webalizer/webalizer");
exec()
原型:string exec (string command [, string array [, int return_var]])
exec()函數與system()類似,也執行給定的命令,但不輸出結果,而是返回結果的最後一行。雖然它只返回命令結果的最後一行,但用第二個參數array可以得到完整的結果,方法是把結果逐行追加到array的結尾處。所以如果array不是空的,在調用之前最好用unset()最它清掉。只有指定了第二個參數時,才可以用第三個參數,用來取得命令執行的狀態代碼。
例子:
複製代碼 代碼如下:
exec("/bin/ls -l");
exec("/bin/ls -l", $res);
exec("/bin/ls -l", $res, $rc);
passthru()
原型:void passthru (string command [, int return_var])
passthru()只調用命令,不返回任何結果,但把命令的運行結果原樣地直接輸出到標準輸出裝置上。所以passthru()函數經常用來調用象pbmplus(Unix下的一個處理圖片的工具,輸出二進位的原始圖片的流)這樣的程式。同樣它也可以得到命令執行的狀態代碼。
例子:
複製代碼 代碼如下:
header("Content-type: image/gif");
passthru("./ppmtogif hunte.ppm");
2.2. 用popen()函數開啟進程
上面的方法只能簡單地執行命令,卻不能與命令互動。但有些時候必須向命令輸入一些東西,如在增加Linux的系統使用者時,要調用su來把目前使用者換到root才行,而su命令必須要在命令列上輸入root的密碼。這種情況下,用上面提到的方法顯然是不行的。
popen()函數開啟一個進程管道來執行給定的命令,返回一個檔案控制代碼。既然返回的是一個檔案控制代碼,那麼就可以對它讀和寫了。在PHP3中,對這種控制代碼只能做單一的操作模式,要麼寫,要麼讀;從PHP4開始,可以同時讀和寫了。除非這個控制代碼是以一種模式(讀或寫)開啟的,否則必須調用pclose()函數來關閉它。
例子1
$fp=popen("/bin/ls -l", "r");
例子2
複製代碼 代碼如下:
/* PHP中如何增加一個系統使用者
下面是一段常式,增加一個名字為james的使用者,
root密碼是 verygood。僅供參考
*/
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood";
$user = "james";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w");
@fputs($fp,$rootpasswd);
@pclose($fp);
3. 養成良好的程式風格
在很多情況下PHP最可貴的特點也可能是它最薄弱的環節就是它的文法鬆散性。 PHP能夠如此廣泛的被使用,因為它使得許多沒有經驗的Web開發人員能夠製作出強大的應用程式,而用不著過多的考慮規劃、連貫性和文檔。不幸的是,正是以上的特點,很多的PHP原始碼很臃腫,很難閱讀甚至無法維護。決定代碼可維護性的重要因素是代碼的格式和注釋。一個工程的所有代碼應該以貫穿始終的形式組織。以下介紹的是如何在PHP程式中養成良好的程式碼風格。
3.1. 縮排
開發人員所有的代碼應該完全按照縮排的方式書寫。這是提高代碼可讀性最基本的措施。即使你沒有注釋你的代碼,縮排對於讓其他人讀懂你的代碼也是非常大的協助。
3.2. 增加註釋
在編程時添加註釋是一個好的習慣.PHP 允許在頁面代碼中添加註釋,具體的注釋方法與C語言注釋文法相同,在指令碼中可以加註釋。可以用 "/*" 和 "*/" 來注釋一段話。可用雙斜杠“//”作為注釋符。
3.3. 控制結構
這個很大程度上取決於個人口味。我仍然可以看到很多的控制結構代碼不帶分支語句造成可讀性非常差,如???你使用IF語句時不帶分支,不但可讀性變差,當其他人修改你的程式時,還會造成很多的bug。請看下例:
不好的例子:
if ($a == 1) echo 'A was equal to 1';
這是非常難以辨認的。它能夠正常工作,但是除了你之外,別人根本不會讚賞這句代碼。 有改進的例子:
if ($a == 1)
echo 'A was equal to 1';
現在至少這句代碼可以讀懂了,但是仍然沒有很好的可維護性。如果當$a==1的時候我希望一個附加的事件發生,或者需要添加分支呢?如果後來的程式員忘記了添加大括弧或者else關鍵字,那麼程式中將出現bug。
完美的例子
複製代碼 代碼如下:
if (($a == 1) && ($b==2)) {
echo 'A was equal to 1'; //很容易的可以添加其他代碼
} elseif (($a == 1) && ($b==3)) { //其他動作
}
請注意在if和elseif後面的空格,這會將本語句和函數調用區分開來,此外,雖然在elseif的執行程式段中沒有語句,只有注釋,表面上顯得多餘可是卻給以後維護程式的程式員給予了非常方便的提示,並且非常利於添加功能。
3.4. 利用 Include 來實現功能模組化
可以將常用的功能函數存於一個PHP檔案,在其它PHP頁中要用其中的功能時,將包含函數的PHP檔案包含在調用函數的PHP檔案中.這時可使用 Include 函數。具體文法為:
include($FileName);
使用時應該注意:
1、應避免自包含,即 File1 包含 File1;在多個檔案中有包含語句時,應避免間接自包含即迴圈包含,如File1包含File2,File2包含File3,File3包含File1.
2、被包含的指令碼語言的類型必須是PHP語言類型或指令碼語句段。