should - PHP con APC: errores fatales: no se puede volver a declarar la clase
xampp apc (6)
Desde que instalé APC for PHP con PECL a veces me sale estos errores: Cannot redeclare class xxx
puedo volver a Cannot redeclare class xxx
xxx cambia de vez en cuando. ¡Podría deshabilitar APC pero APC mejora el rendimiento grandioso! ¿Hay algún error conocido o podría hacer algo más para evitar estos errores? Estoy usando Ubuntu 8.04 LTS con PHP 5.2.4.
Editar / Actualizar (a partir de comentarios):
Utilizo Zend Framework Autoloader y estos errores nunca ocurrieron antes de habilitar APC. Hace unos momentos recibí, por ejemplo, ese error: Error Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27
Bueno, es un problema conocido con apc que mezcla include_once
directivse que se llaman relativamente desde diferentes ubicaciones.
Entonces, si haces include_once myclass.php
y luego en un subdirectorio, include_once ../myclass.php
apc podría mezclar esto y pensar en sus diferentes archivos y cargarlo dos veces.
Sin embargo, esto se corrige en versiones posteriores.
Si puede desglosar su código en la clase que se carga dos veces, podría verificar si la clase ya está cargada con class_defined
o algo que se puede class_defined
.
También puede usar la directiva apc.filter
para evitar que ciertos archivos se almacenen en caché.
Este error ocurrió al usar el AWS SDK
for PHP2
Amazon en un script php que se ejecuta bajo cron
. Una solución fue deshabilitar apc
través de -d apc.enabled=0
como se muestra a continuación:
/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php
Para más información .
Hmmm, parece ser un problema común :
- Opcode (APC / XCache), Zend, Doctrine y Autoloaders
- http://forums.zend.com/viewtopic.php?f=69&t=813
- http://framework.zend.com/issues/browse/ZF-8588
Lo que acabo de notar de su mensaje de error específico es que escribió zend_db_adapter_abstract
en minúsculas. Un problema con los esquemas de nombres de marcos horribles y los autocargadores es que mantienen los archivos en un caso mixto y así lo esperan. Si su código intentó instanciarlo de esta manera, es posible que el autocargador no lo haya encontrado. APC podría ser más peculiar aquí, ya que anula include_once
internamente, tal vez con efectos secundarios.
Una solución sería adaptar el autocargador Zend y mantener manualmente una lista de las clases cargadas y los nombres de archivo (absolutos y en minúsculas) para verificar en lugar de include_once.
De lo contrario, intente xdebug excesivo. Sin acceso a su configuración, todo lo que podemos hacer es adivinar aquí.
La combinación de las siguientes configuraciones lo arreglé para mí:
apc.include_once_override = 0
apc.canonicalize = 0
apc.stat = 0
Sin los 3, recibí el error constantemente, pero con los tres parece que ya no recibo el error :)!
Tuve el mismo problema con un montón de bibliotecas PHP tan pronto como habilité APC. Después de tirar mucho pelo, encontré que la configuración de apc.include_once_override = 0
aclaró las cosas. Sigo monitoreando pero no he vuelto a ocurrir el problema (antes de eso pude inducir el error borrando el caché apc).