PHP с APC: Неустранимая ошибка: не удается переопределить класс

Поскольку я установил APC для PHP с PECL, я иногда получаю такие ошибки: Cannot redeclare class xxx

xxx время от времени меняется. Я могу отключить APC, но APC улучшает производительность! Есть ли известная ошибка или я могу сделать что-то еще, чтобы предотвратить эти ошибки? Я использую Ubuntu 8.04 LTS с PHP 5.2.4.


Изменить / Обновить (из комментариев):

Я использую автозагрузчик Zend Framework, и эта ошибка никогда не возникала до того, как я включил APC. Несколько мгновений назад я получаю, например, что ошибка: Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

У меня была такая же проблема с кучей библиотек PHP, как только я включил APC. После много вытягивания волос я обнаружил, что настройка apc.include_once_override = 0 устранена. Тем не менее мониторинг, но не возникли проблемы повторно (до этого я смог вызвать ошибку, очистив кеш-апк).

Сочетание следующих конфигураций исправило это для меня:

 apc.include_once_override = 0 apc.canonicalize = 0 apc.stat = 0 

Без всех 3 я постоянно получал бы ошибку, но со всеми тремя я, кажется, больше не получаю ошибку :)!

Эта ошибка произошла при использовании AWS SDK от PHP2 для PHP2 в скрипте php, работающем под cron . Одним из решений было отключить apc через -d apc.enabled=0 как показано ниже:

 /usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php 

Для получения дополнительной информации .

Хммм, кажется, общая проблема :

То, что я только что заметил из вашего конкретного сообщения об ошибке, заключается в том, что вы написали zend_db_adapter_abstract во всех строчных zend_db_adapter_abstract . Проблема с схематическими схемами и автозагрузчиками заключается в том, что они хранят файлы в смешанном случае и ожидают этого. Если ваш код попытался создать его таким образом, автозагрузчик, возможно, не нашел его. APC может быть более своеобразным здесь, поскольку он переопределяет include_once внутри, возможно, с побочными эффектами.

Решением было бы адаптировать автозагрузчик Zend и вручную сохранить список загруженных классов и (абсолютные и нижние) имена файлов для проверки проверки вместо include_once.

В противном случае попробуйте чрезмерный xdebug-ing. Без доступа к вашей настройке все, что мы можем сделать, это угадать.

Ну, это известная проблема с apc, что она смешивает include_once directivse, которые называются относительно из разных мест.

Поэтому, если вы include_once myclass.php а затем в подкаталог, include_once ../myclass.php apc, можете смешать это и подумать о его разных файлах и загрузить его дважды.

Однако это исправлено в более поздних версиях.

Если вы можете развернуть свой код для класса, который загружается дважды, вы можете сделать некоторые проверки, если класс уже загружен с помощью class_defined или некоторых вызываемых материалов.

Вы также можете использовать директиву apc.filter чтобы предотвратить кеширование определенных файлов.

Загрузите последнюю версию apc и используйте:

 [APC] apc.cache_by_default = 0 

С apc.stat = 0 сервер загружает файлы php в кеш, если вы его изменяете, php все равно загружает то же самое.

Больше информации: