這篇文章介紹的內容是關於php.ini 配置調優,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
預設安裝的PHP 就像是在百貨公司裡買的普通套裝,雖然合身,卻不完美。調優的 PHP 就像是訂做的套裝,完全搭配你的尺寸。不過,要注意的是,調優 PHP 只是提升 PHP 效能和效率的舉措,對拙劣的程式碼和無回應的 API 呼叫無計可施。
PHP 解釋器在php.ini
檔案中配置和調優,這個檔案在不同作業系統中的位置有所不同,而且一般命令列對應的php.ini
和PHP-FPM 對應的php.ini
檔案是分開的。這裡我們假設配置的是 PHP-FPM 對應的 php.ini,但下面講的最佳化措施適用於所有php.ini
。
附註:我們應該先使用 PHP Iniscan工具掃描 php.ini,檢查使用了安全性的最佳實務。
運行PHP 時需要關心每個PHP 進程要使用多少內存, php.ini
中的memory_limit
設定用於設定單一PHP 進程可以使用的系統記憶體最大值。
這個設定的預設值是128M
,這對大多數中小型PHP 應用來說或許合適,不過,如果運行的是微型PHP 應用,可以降低這個值,以便節省系統資源,反之,如果運行的是記憶體集中型PHP 應用,可以增加這個值。這個值的大小由可用的系統內存決定,確定給PHP 分配多少值是一門藝術,決定給PHP 分配多少內存,以及能負擔起多少個PHP-FPM 進程時,可以根據以下維度信息進行判斷:
總共可以分配給PHP 多少記憶體?以一個 2G 記憶體的 VPS 為例,這台裝置中可能還運行了其他進程,如 MySQL、Nginx 等,那麼留 512M 給 PHP 是合適的。
每個 PHP 行程平均耗費多少記憶體?這個要監控進程的記憶體使用量,可以使用命令列命令top,也可以在PHP 腳本中呼叫memory_get_peak_usage()
函數,不管使用哪種方式,都要多次執行同一個腳本,然後取記憶體消耗的平均值。
能負擔多少個 PHP-FPM 進程?假設我給 PHP 分配了 512M 內存,每個 PHP 進程平均耗費 15M 內存,那麼我可以負擔 34 個 PHP-FPM 進程。
有足夠的系統資源嗎?最後還需要確認有足夠的系統資源來執行 PHP 應用程式並處理預期的流量。
附註:我們應該使用Apache Bench 或Siege 在類似生產環境的條件下對PHP 應用做壓力測試,以確定生產環境是否有足夠的資源可用。
確定要分配多少記憶體後,就可以設定PHP 的Zend OPcache 擴展,關於這個擴展的詳細資訊可參考這篇文章:http://laravelacademy .org/post/4396.html。
PHP 5.5.0 內建了這個擴展,以下是在php.ini 檔案中設定和最佳化Zend OPcache 擴充功能所使用的設定:
opcache.memory_consumption = 64 :為操作碼快取分配的記憶體(單位是MB),分配的記憶體量應該可以保存應用程式中所有PHP 腳本編譯得到的操作碼,這個值根據應用的體積可以設定成不同大小的值。
opcache.interned_strings_buffer = 16:用來儲存駐留字串的記憶體量(單位是MB),什麼是駐留字串呢? PHP 解釋器會在背後找到相同字串的多個實例,把這個字串保存在記憶體中,如果再次使用相同的字串,PHP 解釋器會使用指針,這麼做的目的是節省記憶體。預設情況下,PHP 駐留字串會隔離在各個PHP 進程中,這個設定能讓PHP-FPM 進程池把所有進程駐留字串儲存到共享的緩衝區中,以便在PHP-FPM 進程池中的多個進程之間引用駐留字串,這樣能節省更多記憶體。
opcache.max_accelerated_files = 4000:操作碼快取中最多能儲存多少個PHP 腳本,這個值的區間是2000 到100000 之間,這個值一定要比PHP 應用程式中的文件數大。
opcache.validate_timestamps = 1:這個設定的值為1時,經過一段時間後PHP 會檢查PHP 腳本的內容是否有變化,檢查的時間間隔由opcache.revalidate_freq 設定指定。如果這個設定的值為0,PHP 不會檢查 PHP 腳本的內容是否有變化,我們必須自己清除快取的操作碼。建議在開發環境中設定為1,生產環境中設定為0。
opcache.revalidate_freq = 0:設定多久(單位是秒)檢查一次 PHP 腳本內容是否有變化。設定為0秒的意思是僅當opcache.validate_timestamps 設定為1時,才會在每次要求時重新驗證PHP 文件,因此,在開發環境中每次都會重新驗證PHP 文件,在生產環境中則不驗證。
opcache.fast_shutdown = 1:這樣設定能讓操作碼使用更快的停機步驟,把物件析構和記憶體釋放交給 Zend Engine 的記憶體管理器完成。
如果你的應用程式允許上傳文件,最好設定最大能上傳的檔案大小。除此之外,最好還要設定最多能同時上傳多少個檔案:
file_uploads = 1upload_max_filesize = 10Mmax_file_uploads = 3
1
#2
附註:如果要上傳大文件,Web 伺服器的設定也要做相應調整。除了在 php.ini 中設定之外,還要調整 Nginx 虛擬主機配置中的 client_max_body_size 設定。最長執行時間php.ini 檔案中的 max_execution_time 用於設定單一 PHP 進程在終止之前最長可運行時間。這個設定預設是30 秒,建議將其設為5 秒:
max_execution_time = 5
:在PHP 腳本中可以呼叫set_limit_time()函數覆蓋這個設定。假設我們想要產生報告,並且把結果製作成PDF 文件,這個任務可能要花10 分鐘才能完成,而我們肯定不想讓PHP 請求等待10 分鐘,我們應該單獨寫一個PHP 文件,讓其在單獨的後台進程中執行,Web 應用程式只需幾毫秒就可以派生一個單獨的後台進程,然後返回HTTP 回應:
<?phpexec('echo "create-report.php" | at now');echo 'report pending...';
#create-report.php 在單獨的後台進程中運行,運行完畢後可以更新資料庫,或是透過電子郵件把報告發給收件者。不過這種用法很少見,更多時候我們是透過非同步消費佇列來實現類似的功能,無論從安全性、擴展性、可維護性來講,效果更好,相關的元件有輕量級訊息佇列PHPResque 等。
session.save_handler = 'memcached'session.save_path = '127.0.0.1:11211'2
output_buffering = 4096implicit_flush = false2
附註:如果想要修改輸出緩衝區的大小,請確保使用的值是4(32位元系統)或8(64位元系統)的倍數。真實路徑快取PHP 會快取應用程式使用的檔案路徑,這樣每次包含或匯入檔案時就無需不斷搜尋包含路徑了,這個快取叫做真實路徑快取( realpath cache),如果運行的是大型的PHP 文件(如Composer 元件),使用了大量文件,增加PHP 真實路徑快取的大小能得到更好的效能。 真實路徑快取的預設大小是16K,這個快取所需的準確大小不容易確定,不過可以使用一個小技巧:首先,增加真實路徑快取的大小,設定為特別大的一個值,如256K,然後,在一個PHP 腳本的末尾加上print_r(realpath_cache_size());,輸出真實路徑快取的真正大小,最後,把真實路徑快取的大小改為這個真正的值。我們可以在php.ini 檔案中設定真實路徑快取的大小:
realpath_cache_size = 64K
以上是php.ini 配置調優的詳細內容。更多資訊請關注PHP中文網其他相關文章!