2009-09-01 20 views
7

Estoy tratando de usar APC o XCache como código de operación para almacenar en caché mis páginas de php. Lo estoy usando con Zend y Doctrine y está teniendo un problema con el autocargador.Opcode (APC/XCache), Zend, Doctrine y autocargadores

Si trato con APC, me sale el siguiente:

Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: 
    Class Doctrine_Event could not be loaded in 
    C:\\[mydir]\\library\\doctrine\\Doctrine\\Record.php on line 777 

Si trato con XCache me sale el siguiente:

PHP Fatal error: Cannot redeclare class Zend_Registry in 
    C:\\[mydir]\\library\\zendframework\\Zend\\Registry.php on line 0 

estoy corriendo Zend 1.9.1, 1.1 Doctrina en un cuadro de ventanas.

Mi rutina de carga es el siguiente:

set_include_path(dirname(__FILE__).'/../library/zendframework' 
. PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'..... 

require 'Zend/Loader/Autoloader.php'; 

$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->suppressNotFoundWarnings(false); 
$loader->setFallbackAutoloader(true); 

Por lo que he leído, el uso de APC o XCache es casi una necesidad para el rendimiento, pero me parece que no puede conseguir que funcione. ¿Algunas ideas?

Respuesta

10

Puede poner un "Zend_Session::writeClose(true);" al final de su index.php.
Esto escribirá la sesión en un estado persistente antes de que se destruyan los Objetos necesarios (Zend_Loader etc.).

Mejor: Registrarlo como shutdown function.
Por lo tanto, se ejecutará incluso si se utiliza exit(), die() o una fatal error occures:

register_shutdown_function(array('Zend_Session', 'writeClose'), true); 
+0

Esto lo resolvió para mí, usando APC. – smoove

+0

El crédito por register_shutdown_function va a hogberg y battal. –

0

¿Hay algo más que omita la ruta include? Tal vez intente desconectarse de la ruta de inclusión justo antes de esa línea en su primer ejemplo de APC.

El XCache uno es realmente extraño. Ese proyecto está bastante muerto, y no confiaría en PHP 5.2+. Pruebe eaccelerator en su lugar? Hemos tenido la mejor suerte con eso.

+0

Hay otras cosas específicas de Doctrine en la ruta de inclusión (modelos, etc.). Estamos buscando un backend de ZendCache (http://framework.zend.com/manual/en/zend.cache.backends.html) para que eaccelerator no funcione. –

+0

Hay una propuesta para un backend de eaccelerator http://framework.zend.com/wiki/display/ZFPROP/Zend_Cache_Backend_Eaccelerator+-+Federico+Cargnelutti - debería ser realmente fácil de implementar realmente. De todos modos, lo que me preguntaba es si algo está eliminando las rutas incluidas de inclusión del total antes de que se produzca ese error. – Justin

3

Probablemente es similar al problema con el manejo de sesión personalizado y APC-cache. Si ha asignado un controlador de sesión personalizado, se registra con RSHUTDOWN en PHP. Es la misma rutina que utiliza APC y, por lo tanto, creará un conflicto interno en PHP y su controlador de sesión personalizado no se cerrará en todas las situaciones.

por lo que tendrá que asegurarse de cerrar manualmente el controlador de sesión personalizado al apagar el equipo

Poner una "Zend_Session::writeClose(true);" al final de su index.php no es la mejor manera de hacerlo que en caso de tener cualquier salida; llama a tus scripts en cualquier lugar.

Es mejor registrar un controlador de apagado de esta manera:

function shutdown() 
{ 
Zend_Session::writeClose(true); 
} 

register_shutdown_function('shutdown'); 

poner esto en la parte superior de su archivo index.php para asegurarse de que el procedimiento de cierre se ha registrado antes de ejecutar cualquier otros scripts.

0

Benjamin Cremer, eres un salvavidas. Si bien el problema anterior (original) es un caso especial de carga automática de sesiones, el cierre de la sesión parece ser una solución general para tales casos.Una nota aunque:

Colocar Zend_Session::writeClose(true); al final de las secuencias de comandos no siempre puede cortarlo, ya que es posible que tenga exit; 's, die();' s, etc en el código. En este caso, puede utilizar

register_shutdown_function(array('Zend_Session', 'writeClose'), true);

o, simplemente

register_shutdown_function('session_write_close');

si no se utiliza para las sesiones de Zend.

Cuestiones relacionadas