天天看點

設定記憶體GC提高IIS+PHP運作穩定性

IIS配置php提供web服務. 短期通路正常,長時間高壓力通路容易崩潰.表現為IIS提示500錯誤,php-cgi.exe崩潰. 此時在php日志中看不到任何異常,但windows事件日志記錄下了php-cgi.exe應用程式錯誤. 其原因和php記憶體管理有關.有以下改善方法 1. 伺服器配置足夠實體記憶體.根據任務管理器界面的實體記憶體資料,保留更多的空閑實體記憶體給php-cgi.exe使用. 避免總記憶體占用超過實體記憶體. 2. 給php-cgi.exe配置足夠記憶體.php記憶體回收機制決定了達到一半的記憶體占用時就會運作gc. 頻繁的gc造成php崩潰(windows版php的bug)

;根據實際情況可以改大些. 最好超過實際占用值的兩倍以上(任務管理器可以檢視php-cgi程序得知實際占用值)
memory_limit = 128M
      

程式中如下代碼,效果和更改php.ini相同.

ini_set('memory_limit','128M');
           

3. fastcgi配置請求超過一定數量(例如1000) 就重新開機程序.

MaxInstances=64   #根據記憶體和CPU情況配置最大php-cgi.exe程序數. 不要伺服器壓力過大.
       InstanceMaxRequests=1000  #每處理1000個請求則重新開機執行個體. 
       EnvironmentVars=PHP_FCGI_MAX_REQUESTS:1000 #同上
      

如果64/1000還不行,可以配置更少 4.減少請求處理記憶體占用和處理時長.優化PHP代碼,提高程式性能和減少記憶體占用。比如使用php完成采集任務時避免一次采集過多内容(那樣會占用大量的記憶體和單次cpu處理時間). 5. 可以考慮在php處理過程中關閉gc.雖然關閉gc會造成php記憶體占用增大,但可以避免頻繁運作gc造成php-cgi.exe崩潰.

gc_collect_cycles();
gc_disable();
....php業務代碼.
gc_enable();
           

以上方法可以極大的改善windows版php的運作穩定性. 總結就是以下幾點:1. 不要讓PHP伺服器滿負荷運作.2. 盡可能減少PHP引擎的記憶體回收次數(通過優化代碼降低記憶體占用或關閉gc實作)