snippets · php
PHP findet eine Datei lokal, auf LIVE aber nicht – welcher Pfad ist eigentlich relativ wozu?
Lokal funktioniert require '../config/app.php', auf LIVE kommt failed to open stream. Die Datei existiert – nur der relative Ausgangspunkt ist ein anderer.
Das Problem sichtbar machen
<?php
var_dump([
'__DIR__' => __DIR__,
'cwd' => getcwd(),
'include_path' => get_include_path(),
]);
__DIR__ ist an die Datei gebunden, in der der Ausdruck steht. getcwd() hängt vom Prozess und Aufrufkontext ab.
Gerade CLI, CGI/FPM und Apache können sich beim aktuellen Working Directory unterschiedlich verhalten.
Robuster Pfad für Projektstruktur
Statt vom Working Directory aus zu navigieren:
$config = require dirname(__DIR__, 2) . '/config/app.php';
Damit ist der Pfad relativ zum Quellcode selbst.
Vor dem Require kann eine Diagnose helfen:
$path = dirname(__DIR__, 2) . '/config/app.php';
var_dump($path, is_file($path), is_readable($path));
Wenn is_file() true und is_readable() false ist
Dann ist der Pfad korrekt, aber Rechte/Ownership sind das nächste Problem. Wenn schon is_file() false ist, zuerst Deployment-Pfad und DocumentRoot prüfen.
Der wichtige Unterschied: Pfadproblem und Rechteproblem sehen beim require ähnlich aus, brauchen aber völlig andere Lösungen.