Поскольку я установил 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 все равно загружает то же самое.
Больше информации: