PHP5.3升級PHP5.4過程當中遇到的問題及解決方案

背景

    因爲準備採用Yii2開發,必須將php環境升級到5.4+,而公司目前的服務器是win2003,PHP從5.5開始,就不支持XP和2003了,所以目前最高的5.6版本就不期望了。php

當前配置

   Windows 2003 Server(32位)
web

    Apache2.2 + FCGI 2.3.6shell

    PHP 5.3.6 nts + WinCachewindows

第一次升級

    PHP 5.4.45 nts + WinCacheapi

    升級後本地測試一切正常,放到服務器上後,問題開始出現了,日誌裏不按期(1個小時或幾個小時)出現一些錯誤,出錯的現象是:web服務沒法正常返回,php-cgi.exe的個數有可能爲0。大約幾分鐘後,能自動恢復。日誌錯誤大概是如下幾種:緩存

    mod_fcgid: read timeout from pipe安全

    Premature end of script headers: index.php服務器

    管道已結束。  : mod_fcgid: get overlap result error性能

    PHP Fatal error:  WINCACHE: lock_readlock: acquired abandoned mutex FILE_CHANGE_NOTIFY測試

分析&嘗試

    懷疑是fcgi的問題,調整了一系列參數,例如:PHP_FCGI_MAX_REQUESTS,FcgidIOTimeout,問題依然存在

    找了幾個fcgi的其它兩個版本,問題依然存在

    實在沒招了,打算放棄fcgi模式,採用isapi模式

第二次:isapi模式

    因爲isapi模式須要線程安全(ts)版本,所以須要從新下載全部相關文件的ts版本。

    生成環境須要考慮性能,沒有opcode緩存是不能容忍的,那麼問題來了,之前使用的WinCache並無ts版本!這能夠理解,WinCache畢竟是Microsoft爲了IIS更好的支持PHP而開發的,而IIS就是採用的FastCGI與PHP鏈接,不支持ts實屬正常。

    因而,我換用APC,開發機是win7,一切正常,放到win2003服務器上,發現apc模塊沒法加載。因而網上一陣狂搜,終於找到一個win2003上能用的版本(感謝好心人!神奇的是,這個版本在win7上又不能加載,這也無所謂了)

    一切就緒,放上服務器開跑。很是鬱悶,雖然上文中的報錯信息不出現了,可是出現了更嚴重的問題:跑了一段時間後,Apache崩潰了。在windows中,Apache運行起來會有兩個httpd.exe存在,崩潰了就只有一個httpd.exe在運行,而個人服務監控腳本還檢測不到Apache服務已經歇菜了,這樣,頁面徹底沒法訪問,狀況更壞了!

再思考

    都是跑一段時間後再出錯,讓我意識到應該是某個模塊不穩定形成的。如今已經放棄了fcgi依然有問題,而且,以前使用PHP5.3.6 nts時,並沒有穩定性問題,fcgi模塊的穩定性嫌疑能夠暫時排除。Apache也是用的之前的版本,如今只剩下PHP+APC了,所以,我作了一個嘗試,禁用APC,效果竟然出奇的好!系統一直很是穩定,那麼問題基本定位了,不穩定是因爲opcode緩存模塊形成的,換成PHP5.4.45後,不管是wincache,仍是apc,均是如此。

尋找解決方案

    問題定位以後就比較容易了,既然目前的opcode緩存都有問題,我就試試其餘的。前後嘗試了opcache、eAccelerator、xcache,常常碰到load失敗的問題,最後xcache3.2.0知足需求,經過了線上試跑。

    接下來,將整個方案換回 fcgi 模式,服務一樣很穩定,這下內心終於踏實了。

xcache

    備忘一下xcache的配置

xcache.size = 32M
xcache.readonly_protection = On

    說明:

    size屬性缺省是0,這意味着xcache並無開啓!

    readonly_protection 屬性是寫保護,開始能增長穩定性,但會帶來一點性能損失。

遺留的問題

    在 fcgi 模式下,xcache的緩存是針對單個php-cgi.exe的,這回致使目錄中的同一個文件會被不一樣的php-cgi.exe解析並緩存。關於這一點,xcache文檔上有說明,並提供瞭解決方案,我按照說明配置了 PHP_FCGI_CHILDREN 參數,並無改善。

相關文章
相關標籤/搜索