首頁  >  文章  >  後端開發  >  php.ini 配置調優

php.ini 配置調優

不言
不言原創
2018-04-26 11:21:131654瀏覽

這篇文章介紹的內容是關於php.ini 配置調優,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

預設安裝的PHP 就像是在百貨公司裡買的普通套裝,雖然合身,卻不完美。調優的 PHP 就像是訂做的套裝,完全搭配你的尺寸。不過,要注意的是,調優 PHP 只是提升 PHP 效能和效率的舉措,對拙劣的程式碼和無回應的 API 呼叫無計可施。

php.ini檔案

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 應用做壓力測試,以確定生產環境是否有足夠的資源可用。

Zend OPcache

確定要分配多少記憶體後,就可以設定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

  • ##3

預設情況下,PHP 允許在單次請求中上傳20 個文件,上傳的文件最大為2MB,這裡我設定為單次請求最多只能上傳3 個文件,每個文件最大為10MB,這個值不要設定太大,否則會出現逾時。

附註:如果要上傳大文件,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(&#39;echo "create-report.php" | at now&#39;);echo &#39;report pending...&#39;;

  • 1

  • #2

  • 3

#create-report.php 在單獨的後台進程中運行,運行完畢後可以更新資料庫,或是透過電子郵件把報告發給收件者。不過這種用法很少見,更多時候我們是透過非同步消費佇列來實現類似的功能,無論從安全性、擴展性、可維護性來講,效果更好,相關的元件有輕量級訊息佇列PHPResque 等。

處理會話

PHP 預設的會話處理程序會拖慢大型應用,因為這個處理程序會把會話資料儲存在硬碟中,需要建立不必要的磁碟I/O,浪費時間。我們應該把會話資料保存在記憶體中,例如可以使用 Memcached 或 Redis。這麼做還有個額外好處 —— 以後便於伸縮。如果會話資料儲存在硬碟中,不便於增加額外的伺服器,如果把會話資料存放在 Memcached 或 Redis 裡,任何一台分散式 PHP-FPM 伺服器都能存取會話資料。

如果想把會話資料保存在Memcached 中,需要做如下配置:

session.save_handler = &#39;memcached&#39;session.save_path = &#39;127.0.0.1:11211&#39;2

緩衝輸出

#如果是在較少的區塊中發送更多數據,而不是在較多的區塊中發送較少的數據,那麼網路的效率會更高,也就是說,在較少的片段中把內容傳遞給訪客的瀏覽器,能減少HTTP 請求總數。

因此,我們要讓PHP 緩衝輸出,預設情況下,PHP 已經啟用了輸出緩衝功能,PHP 緩衝4096 位元組的輸出之後才會把內容傳送給Web 伺服器,建議設定如下:

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中的session主要配置

php.ini中的常用配置詳解

以上是php.ini 配置調優的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn