Opcode (APC/XCache), Zend, Doctrine, und Autoloader
Ich bin versucht, entweder APC oder XCache als opcode-cache meine php-Seiten. Ich benutze es mit Zend und Doctrine und es ist ein problem mit dem autoloader.
Wenn ich versuche mit APC, bekomme ich die folgende:
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
Wenn ich versuche mit XCache bekomme ich die folgende:
PHP Fatal error: Cannot redeclare class Zend_Registry in
C:\\[mydir]\\library\\zendframework\\Zend\\Registry.php on line 0
Ich bin mit Zend 1.9.1, Lehre 1.1 auf einem windows-Rechner.
Meine bootstrap ist wie folgt:
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);
Von dem, was ich gelesen habe, mit APC oder xcache ist fast ein muss für die Leistung, aber ich kann nicht scheinen, um es funktioniert. Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man eine "
Zend_Session::writeClose(true);
" am Ende Ihrer index.php.In diesem schreiben wird die Sitzung in einem persistenten Zustand, bevor die notwendigen Objekte (Zend_Loader etc.) Holen Sie zerstört werden.
Besser: Registrieren Sie es als shutdown-Funktion.
So wird es auch ausgeführt werden, wenn Sie
exit()
,die()
oder einefatal error
erfolgt:Es ist wohl ähnlich wie das problem mit benutzerdefinierten session-handling und APC-cache. Wenn Sie zugeordnet haben mit einer benutzerdefinierten session-handler registriert ist, mit RSHUTDOWN in PHP. Es ist die gleiche routine, die APC verwendet und wird daher erstellen Sie einen internen Konflikt in PHP und Ihre benutzerdefinierten session-handler wird nicht schließen Sie in allen Situationen.
So stellen Sie sicher, dass Sie manuell schließen Sie das custom session handler beim Herunterfahren
Indem ein
"Zend_Session::writeClose(true);"
am Ende Ihrer index.php ist nicht die beste Weise zu tun, dass bei jedem beenden; fordert in Ihren Skripten überall.Ist es besser, registrieren Sie einen shutdown-handler auf diese Weise:
Setzen, dass in der Spitze Ihrer index.php Datei stellen Sie sicher, dass der shutdown-Vorgang registriert wird, bevor andere Skripte ausgeführt werden.
Ist es etwas, das ausmisten der include-Pfad? Vielleicht versuchen, sich aus der include-Pfad Recht vor, die Zeile in der ersten APC-Beispiel.
Den XCache ist wirklich seltsam. Das Projekt ist ziemlich tot, obwohl, und ich würde nicht darauf Vertrauen, das auf PHP 5.2+. Versuchen eaccelerator statt? Wir habe die besten Glück mit es.
Benjamin Cremer, Sie sind ein Lebensretter. Während die oben (original) - problem ist ein Spezialfall des autoloading mit Sitzungen, Schließung der Sitzung scheint eine Allgemeine Lösung für solche Fälle. Ein Hinweis allerdings:
Platzierung
Zend_Session::writeClose(true);
am Ende des Skripts kann nicht immer schneiden Sie es, da Sie möglicherweiseexit;
's,die();
's, usw. in Ihrem code. In diesem Fall können Sieregister_shutdown_function(array('Zend_Session', 'writeClose'), true);
oder einfach
register_shutdown_function('session_write_close');
wenn Sie nicht mit der Zend für Sitzungen.