2009-11-30 7 views
2

Je cours Symfony (1.2.9) avec PHP Version 5.2.11 sur Windows XP.Impossible de redéclarer la classe sfconfig

Je APC installé (version 3.0.19)

Je peux exécuter le script PHP pour prouver que apc fonctionne correctement (travaux). Cependant, lorsque je tente d'utiliser APC appelle à une action de symfony, je reçois cette erreur (dans le fichier error.log apache):

[apc erreur] Impossible redéclarer classe sfConfig

qui bloque rapidement Apache.

J'ai essayé d'utiliser l'encapsuleur Symfony sfAPCCache, puis d'appeler directement les fonctions apc_ * - le résultat est le même. Est-ce que quelqu'un sait pourquoi cela se passe?

Répondre

3
+0

Je marquerai votre réponse comme acceptée. Il a fourni un correctif (qui m'a permis de continuer à travailler), mais n'a pas expliqué pourquoi j'ai dû mettre la config apc.stat à zéro (off). Au moins cela fonctionne, donc je peux continuer à développer sur ma boîte de fenêtres. Je ne vais pas avoir ce problème lorsque je passe sur mon serveur, qui a un système d'exploitation REAL (pas une souris mickey un). –

+0

Si possible, vous pouvez essayer une version plus récente de php/APC et voir si l'erreur persiste. –

0

Ive a eu cette erreur avant sans rapport avec APC et il a toujours aidé non seulement à lancer le cache: clair, mais aussi pour vérifier et assurez-vous que tous les les fichiers ont été supprimés du répertoire de cache.

0

Je vivais la même situation sur mon système de développement Windows avec php 5.2.11 et plusieurs versions apc. Même situation comme décrit, avec stat = 0 tout fonctionne, mais lorsque je définis stat = 1, apache se bloque avec erreur "ne peut pas redeclare classe [some class]". Le code fonctionne sur un système Windows différent, à côté il est en direct sur un serveur de production Linux lourdement chargé pendant des mois. Je suis% 100 sûr il n'y a pas de bug lié à apc. Il a commencé sur ma machine après avoir réinstallé mon système d'exploitation.

J'ai passé un certain temps à commenter une classe inclut et a réalisé que cela fonctionne avec certains fichiers include mais pas avec spécifiques. J'ai vérifié mon code il n'y a pas de différence notable sur les différences de classe.

Puis j'ai sauvegardé tous mes fichiers d'inclusion en ajoutant quelques espaces blancs supplémentaires avec l'éditeur de Zend Studio. Il semble stupide je sais mais ça marche !!! Je travaille sur le projet avec plusieurs personnes et en utilisant svn et tout le monde utilise différents éditeurs de texte comme Notepad ++, editplus etc ...

Cependant, je ne pouvais pas reproduire l'erreur en essayant de sauvegarde le fichier avec une autre éditeurs avec différentes configs comme ansi, utf8 avec/sans ordre de byte-mark etc. Mais je suis sûr mon problème est quelque chose lié au format de fichier (codage, mode pc/unix). Je voudrais reproduire l'erreur et vouloir donner plus d'informations détaillées mais j'ai essayé ma solution sur un autre projet avec le même problème, cela fonctionne non plus.

J'espère que je pourrais donner un autre point de vue sur le problème.

0

Ce qui a résolu cela pour moi était de s'assurer que mes besoins avaient le même chemin.

Par exemple, l'erreur je suis arrivé était:
[apc-error] Cannot redeclare class someClass

Dans le fichier AI avait les éléments suivants:
require_once '/path/to/someClass.php';

Dans le fichier B qui se trouve dans le même répertoire que j'ai eu le someClass.php suivant:
require_once 'someClass.php';

Je crois que la mise en cache APC ne comprenait pas qu'ils étaient le même fichier car le chemin était spécifi ed pour l'un et pas l'autre.

2

Aujourd'hui, cette erreur est arrivé à moi aussi, et je pris conscience des raisons pour lesquelles il peut arriver (parmi d'autres possibles raisons).

APC identifie correctement chaque classe par un nom complet, qui comprend l'espace de noms des classes. Malheureusement, vous pouvez vous référer à la même classe avec des noms différents.

Par exemple:

J'ai eu une fausse déclaration « utilisation » dans mon code, l'importation d'une classe sans espaces de noms comme si elle avait été à l'intérieur d'un espace de noms.

La classe, dites « MyClass » était dans l'espace de noms « \ », ce qui signifie était « \ MyClass » son nom correct et complet.

À un certain moment, la classe a été renvoyé par son nom non qualifié « MyClass » et nous avons obtenu autochargée. Dans un autre fichier, j'ai (à tort) fait référence à la classe avec un préfixe d'espace de nommage dans une instruction use, dites "use \ SomeNamespace \ MyClass;". Par conséquent la classe a été (encore) passée à ma méthode __autoload() globale, mais avec un nom différent. Pour le rendre pire, la méthode de chargement automatique était assez intelligente pour trouver la classe de toute façon.

Instantanément, mon script a cessé de fonctionner et tout ce qui s'est passé était APC écrivant "[apc-error] Impossible de redéclarer classe ..." dans le serveur Web Apache error.log. Mes pages n'étaient plus disponibles.

Ce n'est pas un bug d'APC que ce soit, mais simplement un comportement correct.

Dans mon cas, cela m'a aidé à désactiver temporairement APC (afin que mon script s'exécute indépendamment du conflit) et à connecter une instruction echo dans ma fonction __autoload pour produire une liste des paramètres passés. La classe chargée avec un mauvais nom s'afficherait rapidement, et je pourrais le réparer et réactiver APC.

Espérons que cela aide quelqu'un.