open_basedir-Probleme mit APC und Symfony2

open_basedir-Probleme mit APC und Symfony2

Ich richte derzeit eine gemeinsame Staging-Umgebung für eine unserer Anwendungen ein, die in PHP5.3 geschrieben ist und das Symfony2-Framework verwendet.

Wenn ich nur eine einzige Instanz der Anwendung pro Server hoste, funktioniert alles wie es soll.

Wenn ich dann jedoch zusätzliche Instanzen der Anwendung bereitstelle (die je nach Clientanpassungen möglicherweise denselben Code verwenden oder nicht), erhalte ich Fehlermeldungen wie diese:

[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Warning:  require(/var/www/vhosts/application1/httpdocs/vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php): failed to open stream: Operation not permitted in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Fatal error:  require(): Failed opening required '/var/www/vhosts/application1/httpdocs/app/../vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193

Im Grunde versucht die zweite Site, die Dateien von der ersten Site anzufordern, aber aufgrund von open_basedir-Einschränkungen ist das nicht möglich. Ich bin nicht bereit, open_basedir zu deaktivieren, da dies das Problem nur verschleiert, anstatt es zu lösen, und eine Abhängigkeit zwischen Anwendungen schafft, die nicht vorhanden sein sollte.

Ich dachte zunächst, dass dies mit einem Symfony2-Fehler zusammenhing, habe es jetzt aber auf ein Problem mit APC zurückgeführt. Das Deaktivieren von APC behebt den Fehler ebenfalls, ich mache mir jedoch Sorgen über die Auswirkungen auf die Leistung, die dies mit sich bringt.

Hat jemand Vorschläge, was ich tun könnte?

Antwort1

Ok, es stellte sich heraus, dass dies eher ein Problem mit unserem eigenen Code war und nicht irgendein spezifischer Fehler bei APC oder Symfony2.

Als Hinweis für alle anderen, die hierüber stolpern:

  1. Wir haben die Komponente ApcUniversalClassLoader von Symfony2 verwendet.

  2. Dadurch können Sie ein Präfix für Ihre Cache-Dateien angeben.

  3. Dieses Präfix war bei allen Instanzen unserer Anwendung gleich. Deshalb funktionierte es einwandfrei, solange es nur eine Instanz pro Server gab.

  4. Aufgrund des identischen Präfixes versuchte APC unmittelbar nach dem Neustart des Servers, die Klassen der ersten aufgerufenen Instanz der Anwendung zu laden.

  5. Wenn Sie das Präfix so ändern, dass es für jede Instanz der Anwendung unterschiedlich ist, wird das korrekte Verhalten sichergestellt und die Klassen werden aus den richtigen Ordnern geladen.

Hoffentlich verhindert dies, dass jemand anders seinen Kopf auf den Schreibtisch schlägt, wenn ihm klar wird, warum es nicht funktioniert :)

verwandte Informationen