eAccelerator与php 5.4的兼容问题

NMM的文档库采用了MediaWiki,运行在nginx + php5 + mysql环境里,并由eAccelerator优化,由memcached进行缓存。

前天将服务器的php从5.3.12升级到了5.4.19,然后MediaWiki就白屏了。查了error log之后发现php产生了下面这条错误:

PHP Catchable fatal error: Argument 1 passed to ScopedCallback::__construct() must be an instance of Closure

由于是升级之后立即出现的故障,还以为是MediaWiki不兼容php 5.4,不过网上搜了一下,并没有说wiki与php 5.4不兼容。将错误信息原文google之后,搜到了这篇文章:

安装mediawiki的时候,出现Catchable fatal error

读过之后这才恍然大悟,原来是eAccelerator在php 5.4下(的Bug?)不兼容闭包和匿名函数导致的。不过与上面那篇文章的作者不同,NMM除了wiki还有其他服务,不能简单换掉或者关掉eAccelerator的,于是作为应急措施,只好在php.ini的eaccelerator.filter里把wiki所在的目录屏蔽掉,让eAccelerator不再对wiki进行优化和缓存。

重启了php-fpm让设置生效之后问题又来了。这次是访问wiki的页面提示:

Fatal exception of type MWException

Google之后,MediaWiki的网站上有人出现同样的问题,据说是LocalisationUpdate的Bug导致的。不过我并没有启用LocalisationUpdate,只好继续找。然后在这个帖子里看到,强制重建Localisation缓存可以解决,马上试可一下,顺利排除故障。强制重建Localisation缓存,只要执行maintenance目录下的rebuildLocalisationCache.php即可:

php rebuildLocalisationCache.php –force

完全重建Localisation缓存速度比较慢,请耐心等待。


在GitHub的eAccelerator项目页看了一下Issue,其中一年前的Issue 12就已经报告了闭包和匿名函数的问题,可至今也没有解决。一名叫iHeadRu的用户写了一个补丁,可以在遇到闭包的时候不对其进行优化,不过这也只是回避问题,并非根本上解决。

话说eAccelerator开发长期停滞,没解决的兼容问题和放置Play的Issue堆积如山,我是不是该考虑换APC了呢……

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注