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
Ответы
Ответ 1
У меня была такая же проблема с кучей библиотек PHP, как только я включил APC. После большого притягивания волос я обнаружил, что настройка apc.include_once_override = 0
устранена. Тем не менее мониторинг, но не возникли проблемы повторно (до этого я смог вызвать ошибку, очистив кеш-апк).
Ответ 2
Сочетание следующих конфигураций исправило это для меня:
apc.include_once_override = 0
apc.canonicalize = 0
apc.stat = 0
Без всех 3 я бы постоянно получал ошибку, но со всеми тремя я, кажется, больше не получаю ошибку:)!
Ответ 3
Эта ошибка произошла при использовании Amazon AWS SDK
для PHP2
в PHP скрипт, работающем под cron
. Одним из решений было отключить apc
через -d apc.enabled=0
, как показано ниже:
/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php
Для подробнее.
Ответ 4
Хммм, кажется, общая проблема:
То, что я только что заметил из вашего конкретного сообщения об ошибке, заключается в том, что вы написали zend_db_adapter_abstract
во всех строках. Проблема с схематическими схемами и автозагрузчиками заключается в том, что они хранят файлы в смешанном случае и ожидают этого. Если ваш код попытался создать его таким образом, автозагрузчик, возможно, не нашел его. APC может быть более своеобразным здесь, поскольку он переопределяет include_once
внутренне, возможно, с побочными эффектами.
Решением было бы адаптировать автозагрузчик Zend и вручную сохранить список загруженных классов и (абсолютные и нижние) имена файлов для проверки проверки вместо include_once.
В противном случае попробуйте выполнить чрезмерное xdebug-ing. Без доступа к вашей настройке все, что мы можем сделать, это угадать.
Ответ 5
Хорошо, что известная проблема с apc заключается в том, что она смешивает директиву include_once
, которые называются относительно из разных местоположений.
Итак, если вы делаете include_once myclass.php
, а затем в подкаталоге do include_once ../myclass.php
apc может смешивать это и думать о его разных файлах и загружать его дважды.
Однако это исправлено в более поздних версиях.
Если вы можете развернуть свой код в классе, который загружен дважды, вы можете сделать некоторые проверки, если класс уже загружен с помощью class_defined
или некоторых вызываемых материалов.
Вы также можете использовать директиву apc.filter
, чтобы предотвратить кеширование определенных файлов вообще.
Ответ 6
Загрузите последнюю версию apc и используйте:
[APC]
apc.cache_by_default = 0
С apc.stat = 0 сервер загружает файлы php в кеш, если вы его изменяете, php все равно загружает то же самое.
Дополнительная информация: