Apache运行Zend Framework与多个虚拟主机的间歇性500错误

时间:2011-03-02 21:34:19

标签: php apache zend-framework amazon-ec2 doctrine-orm

在最近的一系列更新之前,我们已经开展了几个月的项目,没有任何问题。服务器运行Amazon Linux AMI版本2010.11.1,Apache 2.2.16和PHP 5.3.3。该项目分为几个独立的开发人员分支,作为虚拟主机运行,每个分支都包含所有代码的完全独立的副本,包括Zend Framework 1.11.3。该项目还包括Doctrine 2.0.1,但我认为这不是问题所在。我过去曾尝试过APC,但我现在还没有安装它。当多个用户跨越不同分支访问服务器时,问题似乎发生得最多。我怀疑这个问题可能与Zend Framework引导过程中所需的某些核心类的不同版本有关,但我无法弄清楚根本原因是什么。我们已经尝试强制所有分支与我们的git repo处于同一版本,然后重新启动Apache。这暂时解决了这个问题,但很快又回来了。这一切都始于一周前,当时我只是为Linux,PHP和Zend Framework安装了一组主流更新。当问题发生时,它甚至会传播到我们的phpmyadmin虚拟主机,它甚至与Zend Framework没有任何关系。我很难过。以下是我们在Apache日志中看到的一组错误:

[Wed Mar 02 20:32:40 2011] [error] [client 127.0.0.1] PHP Warning:  array_keys() expects parameter 1 to be array, null given in /var/www/dev/library/Zend/Loader/Autoloader.php on line 251, referer: https://foo.bar/admin/asset_manage/search
[Wed Mar 02 20:32:40 2011] [error] [client 127.0.0.1] PHP Warning:  Invalid argument supplied for foreach() in /var/www/dev/library/Zend/Loader/Autoloader.php on line 345, referer: https://foo.bar/admin/asset_manage/search
[Wed Mar 02 20:32:40 2011] [error] [client 127.0.0.1] PHP Warning:  array_key_exists() expects parameter 2 to be array, null given in /var/www/dev/library/Zend/Loader/Autoloader.php on line 194, referer: https://foo.bar/admin/asset_manage/search
[Wed Mar 02 20:32:40 2011] [error] [client 127.0.0.1] PHP Fatal error:  Class 'Zend_Config_Ini' not found in /var/www/dev/library/Zend/Application.php on line 383, referer: https://foo.bar/admin/asset_manage/search

3 个答案:

答案 0 :(得分:5)

好吧,经过这个问题的痛苦,事实证明问题是由php realpath_cache的行为改变引起的。当我在我的php.ini中设置realpath_cache_ttl = 0时,不正确加载类的问题就消失了。

我不确定这些更新是如何引入的,但我不认为开发盒上需要缓存,所以这让我重回正轨。在生产服务器上,我应该只为每个Apache服务器运行一个应用程序实例(没有虚拟主机),所以我可能在该场景中使用缓存。

如果有人对realpath_cache问题的原因有任何进一步的了解,我不介意听到它。

答案 1 :(得分:3)

这是PHP 5.3.2中的错误(请参阅https://bugs.php.net/bug.php?id=52083https://bugs.php.net/bug.php?id=50027)。该错误已在PHP 5.3.3中修复。

答案 2 :(得分:0)

我们在类似的服务器设置上遇到了同样的问题 - 在Amazon云上的Ubuntu实例上使用Zend Framework 1.11.1和Doctrine 2在PHP上运行的PHP应用程序。重新启动php-fpm后,问题似乎已经消失。