安装mediawiki的时候,出现Catchable fatal error
今天准备装个公司内部wiki,前面都一气呵成。一切安装完成之后,出现错误:
Catchable fatal error: Argument 1 passed to ScopedCallback::__construct() must be an instance of Closure, unknown given, called in /usr/local/apache/wiki/includes/cache/MessageCache.php on line 346 and defined in /usr/local/apache/wiki/includes/ScopedCallback.php on line 33
简单的看了下,意思是传递给ScopedCallback这个类的参数必须是个闭包(匿名函数)。但是给的确实未知参数。这个unknown很少见过,一般都是提示错误的类型,NULL什么的。于是看了下代码,这段是这样的:
$cache = $this->mMemc;
$isc = new ScopedCallback( function() use ( $cache, $statusKey ) {
$cache->delete( $statusKey );
} );
看样子是给这个回调类,传递删除key的匿名函数,但是这个匿名函数却无法识别,匿名函数是5.3开始支持的,公司用的5.4,应该不是不支持匿名函数的问题,那就看看写法有没有问题,但是找了一下,这写法也对的。
测试发现公司机器上最基本的匿名函数都不支持 如:
function() { return true; }
开始从环境找原因,最后对比本机与内网机器,因为本机是可以正常运行mediawiki的,看了下,相同的匿名函数本机都能运行。
最后对比发现,本机比内网机少装了eAccelerator,多装了xdebug,查了下eAccelerator closure。发现eAccelerator在5.4下确实不兼容closure。
换APC,搞定。