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, чтобы предотвратить кеширование определенных файлов вообще.