PHP с APC: фатальные ошибки: невозможно переопределить класс - PullRequest
20 голосов
/ 01 января 2011

Поскольку я установил APC для PHP с PECL, я иногда получаю следующие ошибки: Cannot redeclare class 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

Ответы [ 6 ]

13 голосов
/ 12 февраля 2012

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

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

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

12 голосов
/ 16 марта 2011

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

3 голосов
/ 11 ноября 2012

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

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

Для больше информации .

2 голосов
/ 02 января 2011

Хммм, похоже, общая проблема :

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

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

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

1 голос
/ 19 февраля 2013

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

[APC]
apc.cache_by_default = 0

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

Дополнительная информация:

1 голос
/ 01 января 2011

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

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

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

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

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

...