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.