slan's blog

有梦就去追,累了就休息

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

date: 2013-07-02 19:56:36

今天准备装个公司内部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,搞定。