Intermittent 500 errors from Apache running Zend F

2019-04-27 07:26发布

问题:

We have been working on a project for several months without any problems until a set of recent updates. The server is running Amazon Linux AMI release 2010.11.1, with Apache 2.2.16 and PHP 5.3.3. The project is divided into a few separate developer branches, running as virtual hosts, each with a completely separate copy of all the code including Zend Framework 1.11.3. The project also includes Doctrine 2.0.1, but I don't think that is where the problem is. I have experimented with APC in the past, but I don't even have it installed right now. The issue seems to occur the most when multiple users are hitting the server across different branches. I suspect that the issue could be related to differing versions of certain core classes that are required during the Zend Framework bootstrap process, but I can't figure out what the root cause is. We have tried forcing all the branches to be at the same version from our git repo, and then restarted Apache. This temporarily resolves the issue, but it soon returns. It all began a week ago when I merely installed a set of mainstream updates for Linux, PHP, and Zend Framework. When the issue is occurring, it even propagates into our phpmyadmin virtual host, which doesn't even have anything to do with Zend Framework. I am stumped. Following is the set of errors we see in the Apache log:

[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

回答1:

Well, after much agony over this issue, it turns out the problem was caused by a change in the behavior of the php realpath_cache. When I set realpath_cache_ttl = 0 in my php.ini, the issue with the improperly loading classes goes away.

I am not sure how this got introduced in these updates, but I don't think the cache is required on a dev box, so this gets me back on track. On a production server, I should only have one instance of the app running per Apache server anyway (no virtual hosts), so I could probably use the cache in that scenario.

If anyone has any additional insight into the cause of the realpath_cache issue, I wouldn't mind hearing it.



回答2:

This is a bug in PHP 5.3.2 (see https://bugs.php.net/bug.php?id=52083 and https://bugs.php.net/bug.php?id=50027). The bug is fixed in PHP 5.3.3.



回答3:

We had the same problem with a similar server setup - a PHP app using Zend Framework 1.11.1 and Doctrine 2 running on nginx with php-fpm on a Ubuntu instance on the Amazon cloud. After restarting php-fpm, the problem seems to have gone away.