【问题标题】:Intermittent 500 errors from Apache running Zend Framework with multiple virtual hostsApache 使用多个虚拟主机运行 Zend Framework 时出现间歇性 500 错误
【发布时间】:2011-07-07 14:59:02
【问题描述】:

在最近的一组更新之前,我们已经在一个项目上工作了几个月,没有任何问题。该服务器正在运行 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

【问题讨论】:

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


【解决方案1】:

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

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

如果有人对 realpath_cache 问题的原因有任何其他见解,我不介意听到。

【讨论】:

  • 我在这里感到很孤独……也许我下次运气会更好。
  • 在过去的两周里,我们刚刚开始在我们的应用程序中注意到这个问题。我们的错误日志显示,这种情况至少持续了 5 周。您的 realpath_cache_ttl=0 也为我们解决了问题。为了正确解决问题,我做了一些研究并在 Zend Server 默认 PHP 设置上找到了this article,并注意到它们的 realpath 默认缓存大小为 256K,而我们的 CentOS 6.2 PHP 5.3.3 配置中的默认缓存大小为 16K。再次尝试 TTL 为 120 的更大的 1M 缓存...
  • 将 realpath 缓存大小提高到 1M 有所帮助,但仅持续了几个小时,然后自动加载器错误再次开始出现,所以我们将 realpath_cache_ttl=0 设置为修复了大约一天,然后错误再次间歇性地出现!似乎当它们出现时,它们会持续 20-30 分钟,然后完全消失。就像其他人在出现此错误的同时注意到的那样,其他相同系统的 PHP 应用程序(如 PHP MyAdmin)也表现出奇怪的行为。这个问题仍然没有真正的解决方案!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-29
      • 2021-03-28
      • 2018-11-10
      • 2021-12-29
      • 2014-08-06
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 2012-04-11
      相关资源
      最近更新 更多