Eine typische Deployment-Strategie für Anwendungen (z.B. mit Deployer) ist es, eine Verzeichnisstruktur zu erstellen, bei der die Versionen einer App nummeriert werden und es einen "current"-Symlink gibt, der auf die Version zeigt, die der Webserver ausliefern soll.
Wenn die aktive Version geändert werden soll ändert man den Symlink und hat sofort die Version geändert. Das kann etwa so ausssehen:
my_app/releases/123/index.php
my_app/releases/123/...
my_app/releases/124/index.php
my_app/releases/124/...
my_app/current -> my_app/releases/124
Ein Problem dabei ist, dass PHP den Opcache verwendet, um PHP-Scripte zu cachen. PHP verwendet dazu aber den absoluten Pfad und nicht den "realen Pfad" ("real path"), prüft also nicht auf Symlinks und verwendet nicht deren Ziele. PHP liefert dann beim Ändern des current
-Symlinks weiterhin die alten Scripte aus dem Cache aus.
Als Lösung für dieses Problem verwenden wir das realdoc
-Modul. Mit dem aktivierten Modul löst schon der Apache dem Symlink auf und übergibt PHP als Document Root und damit als Script-Pfad das Ziel des Symlinks (hier also my_app/releases/124
statt my_app/current
).
Um das realdoc
-Modul zu verwenden muss es einmalig für die Webseite aktiviert werden. Bitte wende Dich an unseren Support und nenne uns die Webseite(n), für die wir das Modul aktivieren sollen.
Es ist dann noch notwendig, eine .htaccess
-Datei im my_app
-Verzeichnis anzulegen, die den Zugriff auf das Verzeichnis erlaubt:
Require all granted
Ohne diese .htaccess
-Datei wird der Apache einen Fehler 403 Forbidden
anzeigen. Die Konfiguration des VirtualHost erlaubt nur den Web-Zugriff (Require all granted
für das eingestellte "originale" Document Root (hier my_app/current
), der Zugriff auf releases
und seine Unterverzeichnisse ist nicht erlaubt. Alternativ kann die .htaccess
-Datei auch in das releases
abgelegt werden um den Zugriff noch enger zu erlauben.