调优 PHP
調(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 的廠(chǎng)商也提供了一種商業(yè)操作碼緩存,包括一個(gè)進(jìn)一步提高效率的優(yōu)化器。
php.ini
PHP 的配置是在 php.ini 中完成的。四個(gè)重要的設(shè)置控制 PHP 可使用多少系統(tǒng)資源,如表 1 所列。
表 1. php.ini 中與資源相關(guān)的設(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)容。
結(jié)束語(yǔ)
本文重點(diǎn)探討 Web 服務(wù)器的調(diào)優(yōu),包括 Apache 和 PHP。對(duì)于 Apache,總體的想法是消除 Web 服務(wù)器必須執(zhí)行的多余檢查,例如處理 .htaccess 文件。還必須調(diào)優(yōu)所用的多處理模塊,以便在使用的系統(tǒng)資源和可供傳入請(qǐng)求使用的空閑 worker 之間找到平衡。對(duì)于 PHP,最好的事情就是安裝一個(gè)操作碼緩存。密切注意幾個(gè)資源設(shè)置也能確保腳本不會(huì)浪費(fèi)系統(tǒng)資源,不會(huì)減慢系統(tǒng)處理其他任務(wù)的速度。
本系列的下一篇也是最后一篇文章將介紹 MySQL 數(shù)據(jù)庫(kù)的調(diào)優(yōu)。請(qǐng)繼續(xù)關(guān)注!
參考資料
學(xué)習(xí)
您可以參閱本文在 developerWorks 全球網(wǎng)站上的 英文原文。
“使用應(yīng)用程序跟蹤對(duì)性能改變進(jìn)行量化分析 ” (developerWorks,2006 年 8 月)介紹了如何利用應(yīng)用程序追蹤來(lái)展示 Apache 配置更改的效果。
“PHP V5.2 中的新增功能,第 1 部分: 使用新的內(nèi)存管理器 ”(developerWorks,2007 年 4 月)涵蓋了 PHP 5.2 在內(nèi)存處理方面的最新變化。PHP 一直在不斷優(yōu)化其對(duì)系統(tǒng)資源的使用。
mod_deflate 是一個(gè) Apache 模塊,可動(dòng)態(tài)壓縮輸出。在 PHP 中也可通過(guò) 輸出壓縮 實(shí)現(xiàn)這種功能。
預(yù)緩存將壓縮 JavaScript 代碼之類(lèi)的靜態(tài)文件。CSS 是提高性能的另一種途徑。壓縮和連接所有 JavaScript 代碼及 CSS 就更好了。
介紹 多處理模塊 的 Apache 文檔值得一讀,可從中了解各模塊的功能性,單擊相應(yīng)鏈接可查看所選 MPM 的具體文檔。
在 developerWorks 中國(guó)網(wǎng)站 Linux 專(zhuān)區(qū) 可找到針對(duì) Linux 開(kāi)發(fā)人員的更多資源。
隨時(shí)關(guān)注 developerWorks 技術(shù)活動(dòng) 和 網(wǎng)絡(luò)廣播。
獲得產(chǎn)品和技術(shù)
如果您的發(fā)布版不包含 eAccelerator,Install From Source 說(shuō)明會(huì)對(duì)您有所幫助。
Alternative PHP Cache 和 Zend Platform 是 eAccelerator 的替代工具。
Siege 使您可以模擬用戶(hù),以便了解站點(diǎn)能夠處理多少流量。
您遲早會(huì)打算緩存站點(diǎn)的某些元素,并將負(fù)載分布到多個(gè) Web 服務(wù)器上。Squid 的加速器模式(也稱(chēng)為反向代理)或 Linux Virtual Server Project 都是不錯(cuò)的工具。
訂購(gòu) SEK for Linux,這有兩張 DVD,包含用于 Linux 的最新 IBM 試用軟件,包括 DB2、Lotus、Rational、Tivoli 和 WebSphere。
利用可從 developerWorks 直接下載的 IBM 試用版軟件 構(gòu)建您的下一個(gè) Linux 開(kāi)發(fā)項(xiàng)目。
轉(zhuǎn)載于:https://blog.51cto.com/wenzengliu/1684529
總結(jié)
- 上一篇: TCP选项:TCP_NODELAY和TC
- 下一篇: PhpStorm配置Xdebug调试PH