Не удается переопределить класс sfconfig - PullRequest
2 голосов
/ 01 декабря 2009

Я использую 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_ * - результат тот же. Кто-нибудь знает, почему это происходит?

Ответы [ 5 ]

3 голосов
/ 01 декабря 2009
2 голосов
/ 07 октября 2010

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

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

Например:

В моем коде был неверный оператор "use", импортирующий класс без пространства имен, как если бы он был внутри пространства имен.

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

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

Мгновенно мой сценарий перестал работать, и все, что произошло, было то, что APC записал "[apc-error] Невозможно повторно объявить класс ..." в файле ошибок веб-сервера Apache. Мои страницы больше не были доступны.

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

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

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

0 голосов
/ 03 февраля 2010

Что решило это для меня, так это то, что мои требования имели тот же путь.

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

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

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

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

0 голосов
/ 15 декабря 2009

Я жил в той же ситуации на моих окнах разработки система с php 5.2.11 и несколькими версиями apc. Так же Ситуация как описано, со stat = 0 все работает, но когда я устанавливаю stat = 1, Apache падает с ошибкой "не может redeclare class [some class] ". Код работает над разные системы Windows, кроме этого, в загружен рабочий сервер linux на месяцы. Я уверен на 100% нет ошибок, связанных с APC. Это началось на моей машине после переустановки ОС.

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

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

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

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

0 голосов
/ 01 декабря 2009

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

...