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 参数,并无改善。

相关文章
相关标签/搜索