2009-09-01 14 views
7

Sto tentando di utilizzare APC o XCache come opcode per memorizzare le mie pagine php. Lo sto usando con Zend e Doctrine e ha un problema con il caricatore automatico.Opcode (APC/XCache), Zend, Doctrine e Autoloaders

Se provo con APC, ottengo il seguente:

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 

Se provo con XCache ricevo il seguente:

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

Io corro Zend 1.9.1, Dottrina 1.1 su una scatola di windows.

mio bootstrap è la seguente:

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); 

Da quello che ho letto, utilizzando APC o xcache è quasi un must per le prestazioni, ma io non riesco a farlo funzionare. Qualche idea?

risposta

10

È possibile inserire un "Zend_Session::writeClose(true);" alla fine di index.php.
Questo scriverà la sessione in uno stato permanente prima che gli oggetti necessari (Zend_Loader, ecc.) Vengano distrutti.

Migliore: Registrarlo come shutdown function.
Così sarà eseguito anche se si utilizza exit(), die() o un fatal error occures:

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

Questo lo ha risolto per me, usando APC. – smoove

+0

Il credito per register_shutdown_function va a hogberg e battal. –

0

C'è qualcos'altro che blocca il percorso di inclusione? Forse prova a scollegare il percorso di inclusione subito prima di quella linea nel tuo primo esempio di APC.

Quello XCache è davvero strano. Quel progetto è piuttosto morto, e non mi fiderei su PHP 5.2+. Prova invece a eaccelerator? Abbiamo avuto la fortuna migliore con questo.

+0

Ci sono altre cose specifiche di Doctrine nel percorso di inclusione (modelli, ecc.). Stiamo cercando un backend ZendCache (http://framework.zend.com/manual/en/zend.cache.backends.html) in modo che eaccelerator non funzioni. –

+0

C'è una proposta per un backend di eaccelerator http://framework.zend.com/wiki/display/ZFPROP/Zend_Cache_Backend_Eaccelerator+-+Federico+Cargnelutti - dovrebbe essere abbastanza facile da implementare davvero. Comunque quello che mi chiedevo è se qualcosa sta rimuovendo i percorsi di inclusione previsti dal totale prima che l'errore venga generato. – Justin

3

Probabilmente è simile al problema con la gestione di sessione personalizzato e APC-cache. Se hai assegnato un gestore di sessione personalizzato è registrato con RSHUTDOWN in PHP. È la stessa routine utilizzata da APC e creerà quindi un conflitto interno in PHP e il gestore di sessione personalizzato non si chiuderà in tutte le situazioni.

Così si dovrà fare in modo di chiudere manualmente il gestore di sessione personalizzato allo spegnimento

Mettere una "Zend_Session::writeClose(true);" alla fine del vostro index.php non è il modo migliore per farlo che nel caso si abbia qualsiasi uscita; chiama i tuoi script ovunque.

E 'meglio registrare un gestore di arresto in questo modo:

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

register_shutdown_function('shutdown'); 

che mettere in cima al vostro file index.php per assicurarsi che la procedura di spegnimento è iscritto prima di qualsiasi altra script vengono eseguiti.

0

Benjamin Cremer, sei un risparmiatore di vita. Mentre il problema sopra riportato (originale) è un caso speciale di autoloading con sessioni, chiudere la sessione sembra essere una soluzione generale per questi casi.Una nota però:

Posizionamento Zend_Session::writeClose(true); alla fine dei vostri script non può sempre tagliare, dal momento che si può avere exit; 's, die();' s, ecc nel codice. In questo caso, è possibile utilizzare

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

o, semplicemente

register_shutdown_function('session_write_close');

se non si usa Zend per le sessioni.

Problemi correlati