因爲準備採用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模式須要線程安全(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.size = 32M xcache.readonly_protection = On
說明:
size屬性缺省是0,這意味着xcache並無開啓!
readonly_protection 屬性是寫保護,開始能增長穩定性,但會帶來一點性能損失。
在 fcgi 模式下,xcache的緩存是針對單個php-cgi.exe的,這回致使目錄中的同一個文件會被不一樣的php-cgi.exe解析並緩存。關於這一點,xcache文檔上有說明,並提供瞭解決方案,我按照說明配置了 PHP_FCGI_CHILDREN 參數,並無改善。