因为准备采用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 参数,并无改善。