Мы работаем над проектом в течение нескольких месяцев без каких-либо проблем до набора последних обновлений. На сервере запущена версия 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-репо, а затем перезапустили 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 realpath_cache. Когда я устанавливаю realpath_cache_ttl = 0
в моем php.ini, проблема с неправильной загрузкой классов уходит.
Я не уверен, как это было введено в этих обновлениях, но я не думаю, что кэш необходим в dev-блоке, так что это возвращает меня в нужное русло. На рабочем сервере у меня должен быть только один экземпляр приложения, запущенного на сервере Apache, в любом случае (без виртуальных хостов), поэтому я мог бы использовать кеш в этом сценарии.
Если у кого-то есть дополнительное понимание причины проблемы realpath_cache, я бы не прочь услышать это.
Это ошибка в PHP 5.3.2 (см. https://bugs.php.net/bug.php?id=52083 и https://bugs.php.net/bug.php?id=50027 ). Исправлена ошибка в PHP 5.3.3.
У нас была та же проблема с подобной настройкой сервера – PHP-приложение, использующее Zend Framework 1.11.1 и Doctrine 2, работающие на nginx с php-fpm на экземпляре Ubuntu в облаке Amazon. После перезапуска php-fpm проблема, похоже, исчезла.