Hallo Gerd und Hans,
Inhaltsverzeichnis:
- realpath ist nicht die Lösung
- stream-resolve-include-path
- require statt include
- fopen statt include/require
realpath()
Vorsicht, nach meiner Erkenntnis löst realpath() keine INCLUDE_PATH-Verweise auf, nur symbolische Links. Und es braucht Execute-Permission auf dem ganzen Pfad zur Datei, weil das unter Linux nötig ist zum Auslesen von Verzeichnisinhalten.
stream-resolve-include-path()
Ich habe das Problem noch nicht gehabt, aber ein kurzer Blick ins Handbuch zeigt stream-resolve-include-path() als mögliches Mittel der Wahl, um einen Datei über den Include-Path zu finden. Soweit ich die Userkommentare dort richtig lese, kann man auch Dateinamen wie "lib/functions.php"
finden, wenn das Elternverzeichnis von lib
im Includepfad steht. Wenn stream_resolve_include_path false
zurückgibt, existiert die Datei im include_path nicht. Da der include_path typischerweise "." enthält (das aktuelle Verzeichnis), ist eine file_exists Abfrage danach nicht mehr nötig.
require statt include?
Die Frage ist dann aber: wofür wird die Abfrage gebraucht? Um eine Fehlermeldung auszugeben, wenn eine Include-Datei nicht existiert? In diesem Fall kann man eventuell statt include auch require verwenden. Existiert die Datei nicht, wirft require ab PHP 8 eine Error-Exception, die man mit try/catch fangen kann. Ein Userkommentar auf der require-Seite im PHP-Handbuch zeigt, wie es geht.
fopen(..., ..., true)
Unter der Voraussetzung, dass man die Datei nicht auf Existenz prüfen, sondern einlesen möchte, gibt es einen weiteren Weg. In der Beschreibung der Kerndirektiven in php.ini steht:
include_path string
Specifies a list of directories where the require, include, fopen(), file(), readfile() and file_get_contents() functions look for files. The format is like the system's PATH environment variable: a list of directories separated with a colon in Unix or semicolon in Windows.
file_exists() ist nicht in der Liste der Funktionen enthalten, die den include_path verwenden. Man könnte aber eine der anderen Funktionen verwenden, z.B. fopen($datei, "r", true)
(3. Parameter auf true bedeutet: verwende den Include Path), wenn man die Datei einlesen will. Wenn es nur um die Existenzprüfung geht, ist stream_resolve_include_path mit file_exists wohl die bessere Idee.
Rolf
sumpsi - posui - obstruxi