2011-01-01 10 views
20

Desde que he instalado APC para PHP con PECL veces tengo estos errores: Cannot redeclare class xxxPHP con APC: Los errores fatales: no se puede redeclare clase

xxx cambios de vez en cuando. ¡Podría desactivar APC pero APC mejora el rendimiento de manera excelente! ¿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 (de comentarios):

uso el cargador automático de Zend Framework y estos errores no se produjeron antes He activado APC. Hace unos momentos me sale por ejemplo ese error: Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

+1

leer todo el mensaje de error. No incluya dicho archivo dos veces. Use 'include_once'. O en su defecto, ajuste todas las definiciones en 'if (! Class_defined (" xxx ")) {' – mario

+0

Además de usar únicamente include_once, intente y vuelva a diseñar la aplicación para hacer uso de la clase de carga automática, de modo que PHP solo incluya archivos cuando sea necesario. También adhiérase a las cosas de sentido común, como una clase por archivo, etc. – Rob

+1

¿qué quiere decir con xxx? ¿es xxx en realidad la clase que quieres cargar? –

Respuesta

1

Bueno, es un problema conocido con la APC que mezcla include_once directivse que se llaman relativamente desde diferentes lugares.

Si hace include_once myclass.php y luego en un subdirectorio, haga include_once ../myclass.php apc podría mezclar esto y pensar en sus diferentes archivos y lo carga dos veces.

Sin embargo, esto se ha solucionado en versiones posteriores.

Si puede desglosar su código en la clase que está cargada dos veces, puede verificar si la clase ya está cargada con class_defined o alguna otra característica invocable.

También puede usar la directiva apc.filter para evitar que algunos archivos se guarden en caché.

+0

Ver mi comentario arriba. – Poru

+0

bien, el problema sigue siendo el mismo. actualice su versión de la AP y/o Zend Framework o bien tiene que parchear su Zend Framework, hay soluciones disponibles en el rastreador de problemas zend o maby puede detectar la excepción en su aplicación. –

2

Hmmm, parece que hay una common issue:

Lo que acabo de dar cuenta de su mensaje de error específico es que usted escribió en resumen, zend_db_adapter_abstract minúsculas Un problema con los horribles esquemas de asignación de nombres de marco y los cargadores automáticos es que mantienen los archivos en mayúsculas y minúsculas y esperan que así sea. Si su código intentó crear una instancia de esta manera, es posible que el autocargador no la haya encontrado. APC podría ser más peculiar aquí, ya que sobrescribe include_once internamente, tal vez con efectos secundarios.

Una solución sería adaptar el autocargador Zend y mantener manualmente una lista de clases cargadas y nombres de archivo (absolutos y en minúscula) como comprobante a prueba en lugar de include_once.

De lo contrario, intente excesivo xdebug-ing. Sin acceso a su configuración, todo lo que podemos hacer es adivinar aquí.

12

Tuve el mismo problema con una gran cantidad de bibliotecas de PHP tan pronto como habilité APC. Después de un montón de tirar del pelo, descubrí que el ajuste apc.include_once_override = 0 aclaraba las cosas. Todavía estoy monitoreando pero no he tenido el problema de que vuelva a ocurrir (antes de eso pude inducir el error borrando el caché de la APC).

12

La combinación de las siguientes configuraciones fijas para mí:

apc.include_once_override = 0 
apc.canonicalize = 0 
apc.stat = 0 

Sin todos 3, que tendría constantemente el error, pero con los tres me parece que ya no obtener el error :) !

+0

Desafortunadamente, estos tres no funcionan para mí (APC 3.1.13 y PHP 5.4.24 CentOS 6.5). Con WordPress es la clase Walker_Page que afirma que se está redeclarando, aunque el archivo no se está llamando más de una vez. Profundizaré más y veré qué puedo encontrar. – Jason

+0

Lo siento Jason, esto funcionó con alguna versión anterior de APC y PHP. Sé con certeza que la versión de PHP con la que estaba trabajando en ese momento no era más nueva que la 5.3. * – Peter

3

Este error ocurrió al utilizar AWS SDK de Amazon para PHP2 en una secuencia de comandos php que se ejecuta en cron. Una solución era desactivar apc través -d apc.enabled=0 como se muestra a continuación:

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php 

Para more info.

Cuestiones relacionadas