LAMP下PHP的調(diào)優(yōu)
調(diào)優(yōu) PHP
PHP 是運(yùn)行應(yīng)用程序代碼的引擎。應(yīng)該僅安裝計(jì)劃使用的那些模塊,并配置您的 Web 服務(wù)器,使之僅為腳本文件(通常是以 .php 結(jié)尾的那些文件)使用 PHP,而非所有靜態(tài)文件。
操作碼緩存
請(qǐng)求一個(gè) PHP 腳本時(shí),PHP 會(huì)讀取該腳本,并將其編譯為 Zend 操作碼,這是要執(zhí)行的代碼的一種二進(jìn)制表示形式。隨后,此操作碼由 PHP 執(zhí)行并丟棄。操作碼緩存將保存這個(gè)編譯后的操作碼,并在下一次調(diào)用該頁(yè)面時(shí)重用它。這會(huì)節(jié)省很多時(shí)間。有多種緩存可用,我比較常用的是 eAccelerator。
要安裝 eAccelerator,您的計(jì)算機(jī)上需要有 PHP 開(kāi)發(fā)庫(kù)。由于不同的 Linux 發(fā)布版存放文件的位置不同,所以***直接從 eAccelerator 的 Web 站點(diǎn)獲得安裝說(shuō)明(參見(jiàn) 參考資料 部分獲得鏈接)。您的發(fā)布版也有可能已經(jīng)包含了一個(gè)操作碼緩存,只需安裝即可。
無(wú)論如何在系統(tǒng)上安裝 eAccelerator,都有一些配置選項(xiàng)需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。eaccelerator.shm_size 定義共享高速緩存的大小,編譯后的腳本就存儲(chǔ)在這里。該值的單位是兆字節(jié)(MB)。根據(jù)您的應(yīng)用程序確定恰當(dāng)?shù)拇笮 Accelerator 提供了一個(gè)腳本來(lái)顯示緩存的狀態(tài),其中包含內(nèi)存占用,64MB 是個(gè)不錯(cuò)的選擇(eaccelerator.shm_size="64")。如果您選擇的值未被接受,那么必須修改內(nèi)核的***共享內(nèi)存的大小。向 /etc/sysctl.conf 添加 kernel.shmmax=67108864,運(yùn)行 sysctl -p 來(lái)使設(shè)置生效。kernel.shmmax 值的單位是字節(jié)。
如果共享內(nèi)存的分配超出極限,eAccelerator 必須將舊腳本從內(nèi)存中清除。默認(rèn)情況下,這是被禁用的;eaccelerator.shm_ttl = "60" 指定:當(dāng) eAccelerator 用完共享內(nèi)存時(shí),60 秒內(nèi)未被訪(fǎng)問(wèn)的所有腳本都將被清除。
另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的廠商也提供了一種商業(yè)操作碼緩存,包括一個(gè)進(jìn)一步提高效率的優(yōu)化器。
php.ini
PHP 的配置是在 php.ini 中完成的。四個(gè)重要的設(shè)置控制 PHP 可使用多少系統(tǒng)資源,如表 1 所列。
表 1. php.ini 中與資源相關(guān)的設(shè)置
設(shè)置 描述 建議值
max_execution_time 一個(gè)腳本可使用多少 CPU 秒 30
max_input_time 一個(gè)腳本等待輸入數(shù)據(jù)的時(shí)間有多長(zhǎng)(秒) 60
memory_limit 在被取消之前,一個(gè)腳本可使用多少內(nèi)存(字節(jié)) 32M
output_buffering 數(shù)據(jù)發(fā)送給客戶(hù)機(jī)之前,有多少數(shù)據(jù)(字節(jié))需要緩存 4096
具體數(shù)字主要取決于您的應(yīng)用程序。如果要從用戶(hù)處接收大文件,那么 max_input_time 可能必須增加,可以在 php.ini 中修改,也可以通過(guò)代碼重寫(xiě)它。與之類(lèi)似,CPU 或內(nèi)存占用較多的程序也可能需要更大的設(shè)置值。目標(biāo)就是緩解超標(biāo)程序的影響,因此不建議全局禁用這些設(shè)置。關(guān)于 max_execution_time,還有一點(diǎn)需要注意:它表示進(jìn)程的 CPU 時(shí)間,而不是絕對(duì)時(shí)間。因此一個(gè)進(jìn)行大量 I/O 和少量計(jì)算的程序的運(yùn)行時(shí)間可能遠(yuǎn)遠(yuǎn)超過(guò) max_execution_time。這也是 max_input_time 可以大于 max_execution_time 的原因所在。
PHP 可執(zhí)行的日志記錄數(shù)是可配置的。在生產(chǎn)環(huán)境中,禁用除最重要的日志以外的一切日志記錄能夠減少磁盤(pán)寫(xiě)操作。如果需要使用日志來(lái)排除問(wèn)題,那么可以按需啟用日志記錄。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR 將啟用足夠的日志記錄,使您發(fā)現(xiàn)問(wèn)題,同時(shí)從腳本中消除大量無(wú)用的內(nèi)容。
【編輯推薦】