Не удается переопределить класс sfconfig

Я запускаю Symfony (1.2.9) с PHP версии 5.2.11 в Windows XP.

У меня установлен APC (версия 3.0.19)

Я могу запустить PHP-скрипт, чтобы доказать, что apc работает правильно (работает). Однако, когда я пытаюсь использовать вызовы APC в действии symfony, я получаю эту ошибку (в файле apache error.log):

[apc-error] Невозможно переопределить класс sfconfig

Что быстро сбой Apache.

Я попытался использовать оболочку Symfony sfAPCCache, а затем напрямую вызвал функции apc_ * – результат тот же. Кто-нибудь знает, почему это происходит?

Сегодня эта ошибка со мной тоже произошла, и я узнал, почему это может произойти (среди возможных других причин).

APC правильно идентифицирует каждый класс с помощью полного имени, которое включает пространство имен классов. К сожалению, вы можете обратиться к одному классу с разными именами.

Например:

У меня был неправильный оператор «use» в моем коде, импортировав класс, не содержащий имен, как если бы он находился внутри пространства имен.

Класс, например «MyClass», был в пространстве имен «\», что означает, что его правильное и полное имя было «\ MyClass».

В какой-то момент класс был назван своим неквалифицированным именем «MyClass» и получил автозагрузку. В другом файле я (ошибочно) ссылался на класс с префиксом пространства имен в операторе use, например «use \ SomeNamespace \ MyClass;». Следовательно, класс был (снова) передан моему глобальному методу __autoload (), но с другим именем. Чтобы сделать это хуже, метод автозагрузки был достаточно умен, чтобы найти класс в любом случае.

Мгновенно мой сценарий перестает работать, и все, что произошло, – это APC, который пишет «[apc-error] Can not redeclare class …» в Apache Web Server error.log. Мои страницы больше не доступны.

Это не ошибка APC, а просто правильное поведение.

В моем случае это помогло временно отключить APC (чтобы мой скрипт был запущен независимо от конфликта) и подключить оператор echo к моей функции __autoload, в результате чего будет представлен список переданных параметров. Класс, загруженный неправильным именем, будет отображаться быстро, и я мог бы исправить его и повторно использовать APC.

Надеюсь, это поможет кому-то.

У Ive была эта ошибка до того, как она не связана с APC, и она всегда помогла не только запустить кеш: очистить, но и проверить и убедиться, что все файлы были удалены из каталога кеша.

Я живу в той же ситуации в моей оконной системе разработки с php 5.2.11 и несколькими версиями apc. В той же ситуации, как описано, при stat = 0 все работает, но когда я устанавливаю stat = 1, apache падает с ошибкой «не может переопределить класс [некоторый класс]». Код работает с другой системой Windows, рядом с ней работает на тяжело загруженном сервере производства Linux в течение нескольких месяцев. Я% 100 уверен, что нет ошибок, связанных с apc. Это началось на моей машине после того, как я переустановил свою ОС.

Я потратил некоторое время на комментирование некоторых классов и понял, что он работает с некоторыми включенными файлами, но не с конкретными. Я проверил свой код, нет заметной разницы в классовых различиях.

Затем я сохранил все мои включенные файлы с добавлением некоторых дополнительных пробелов с редактором Zend Studio. Это выглядит глупо, я знаю, но он работает !!! Я работаю над проектом с несколькими людьми и использую svn, и все используют разные текстовые редакторы, такие как блокнот ++, editplus и т. Д.

Однако я не смог воспроизвести ошибку, попробовав сохранить файл с помощью разных редакторов с различными конфигурациями, такими как ansi, utf8 с / без байтов и т. Д. Но я уверен, что моя проблема связана с файловым форматом (кодирование, шт. / unix). Я хотел бы воспроизвести ошибку и хочу дать более подробную информацию, но я попробовал свое решение в другом проекте с той же проблемой, он работает.

Надеюсь, я мог бы еще раз взглянуть на этот вопрос.

То, что решило это для меня, заключалось в том, чтобы мои требования имели один и тот же путь.

Например, я получил ошибку:
[apc-error] Cannot redeclare class someClass

В файле AI было следующее:
require_once '/path/to/someClass.php';

В файле B, который находится в том же каталоге, что и someClass.php, я имел следующее:
require_once 'someClass.php';

Я считаю, что кэширование APC не понимало, что они были одним и тем же файлом, потому что путь был указан для одного, а не для другого.