include_path: Inkludieren geht nicht
Julian von Mendel
- php
0 Hopsel
Hallo Welt,
in /usr/share/php/Image/Graph.php habe ich eine PEAR-Klasse. Ich habe ein PHP5-Skript, dass diese per require_once 'Image/Graph.php'; einbinden möchte. Rufe ich es über die Konsole auf läuft es einwandfrei. Rufe ich es per HTTP auf erhalte ich die Fehlermeldung, "Image/Graph.php" könnte nicht gefunden werden:
Warning: require_once(Image/Graph.php) [function.require-once]: failed to open stream: No such file or directory in /home/jvm/public_html/tmp/test.php on line 17
Fatal error: require_once() [function.require]: Failed opening required 'Image/Graph.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/jvm/public_html/tmp/test.php on line 17
Der include_path stimmt mit dem des CLI-Interfaces überein, d. h. die Konsolenanwendung verwendet den gleichen Include-Path und kann aber im Gegensatz zur Webanwendung auf die Datei zugreifen. (Was auch den Angaben in der jeweiligen php.ini entspricht.)
Zusammengefasst: Ich verstehe nicht, wie bei dem Include-Path /usr/share/php und der zu inkludierenden Datei Image/Graph.php diese nicht gefunden werden kann, wenn sie sich doch in /usr/share/php/Image/Graph.php befindet.
Kann mir jemand helfen?
Per Google habe ich 3 Leute mit exakt dem gleichen Problem gefunden - alle ohne hilfreiche Antwort.
Vielen Dank
Julian
Hi Julian!
Das klingt für mich, als wären die Rechte nicht oder falsch gesetzt.
MfG H☼psel
Hi,
Hi Julian!
Das klingt für mich, als wären die Rechte nicht oder falsch gesetzt.
sehr naheliegende Überlegung auf die ich selbst hätte kommen müssen - sie trifft aber nicht zu. Habe "chmod 555 /usr/share/php -R" ausgeführt und es hat sich nichts geändert.
Schöne Grüße
Julian
echo $begrüßung;
sehr naheliegende Überlegung auf die ich selbst hätte kommen müssen - sie trifft aber nicht zu. Habe "chmod 555 /usr/share/php -R" ausgeführt und es hat sich nichts geändert.
Das Ausführen-Recht (x) wird nicht benötigt. PHP reicht es, wenn es die Datei lesen (r) kann.
Ändert sich etwas, wenn du dem require_once mal den absoluten Pfad mitgibst?
Warum liegt das PEAR-Paket eigentlich unter /usr/share/php und nicht unter dem ebenfalls im Include-Pfad angegebenen /usr/share/pear?
echo "$verabschiedung $name";
Hi,
Das Ausführen-Recht (x) wird nicht benötigt. PHP reicht es, wenn es die Datei lesen (r) kann.
dachte ich mir. Ich wollte ganz sicher gehen, um jegliche Fehlerquelle zu vermeiden.
Ändert sich etwas, wenn du dem require_once mal den absoluten Pfad mitgibst?
aufgrund oben_basedir-Beschränkung möchte ich das nicht tun. Ich gehe aber stark davon aus, dass sich etwas ändern würde. Kopiere ich die benötigten Dateien ins gleiche Verzeichnis und verwende einen absoluten Pfad gehts aufjedenfall.
Warum liegt das PEAR-Paket eigentlich unter /usr/share/php und nicht unter dem ebenfalls im Include-Pfad angegebenen /usr/share/pear?
Weiß ich nicht. Ich habe es per "pear install ..." installiert und verwende die Standard-Debian-Testing-Konfiguration. Aber das dürfte ja kein Problem machen.
Schöne Grüße
Julian
echo $begrüßung;
Das Ausführen-Recht (x) wird nicht benötigt. PHP reicht es, wenn es die Datei lesen (r) kann.
dachte ich mir. Ich wollte ganz sicher gehen, um jegliche Fehlerquelle zu vermeiden.
Übrigens: Vertrauen ist gut, Kontrolle ist besser. Hast du nachgesehen, dass dein Befehl das gewünschte Ergebnis gebracht hat?
Ändert sich etwas, wenn du dem require_once mal den absoluten Pfad mitgibst?
aufgrund oben_basedir-Beschränkung möchte ich das nicht tun.
Das sollte erstmal nur ein Versuch sein, um dem Fehler auf die Spur zu kommen. Ob das letztlich so bleibt oder doch anders gelöst werden kann, steht auf einem anderen Blatt.
Mit open_basedir und Konsorten musste ich mich bisher noch nicht rumschlagen und habe deshalb keine Erfahrungen damit.
Ich gehe aber stark davon aus, dass sich etwas ändern würde.
Versuch macht kluch ...
Warum liegt das PEAR-Paket eigentlich unter /usr/share/php und nicht unter dem ebenfalls im Include-Pfad angegebenen /usr/share/pear?
Weiß ich nicht. Ich habe es per "pear install ..." installiert und verwende die Standard-Debian-Testing-Konfiguration. Aber das dürfte ja kein Problem machen.
Das war mehr die versteckte Frage, ob die Dateien wirklich unter ...php und nicht etwa unter ...pear liegen und du am falschen Verzeichnis rumdoktorst ...
echo "$verabschiedung $name";
Hi,
das Problem wurde durch die open_basedir-Beschränkung hervorgerufen - scheinbar verhindert open_basedir auch den Zugriff auf Dateien aus include-Verzeichnissen. Weiterhin darf "chmod 444 /usr/share/php -R" natürlich nicht aufgerufen werden, da Ausführ-Rechte für die Verzeichnisse existieren müssen! Am einfachsten ist es, man gibt allen 555 oder differenziert per find.
Das open_basedir-Problem korrigiert man, in dem man die dort erlaubten Verzeichnisse um die Include-Verzeichnisse ergänzt:
<Directory /home/jvm>
php_admin_value open_basedir /home/jvm
</Directory>
wird ersetzt durch:
<Directory /home/jvm>
php_admin_value open_basedir /home/jvm:/usr/share/php:/usr/share/pear
</Directory>
Vielen Dank für eure Hilfe und deinen Lösungsansatz. Das entfernen der open_basedir-Regel hat tatsächlich zum Ziel geführt.
Schöne Grüße
Julian
echo $begrüßung;
das Problem wurde durch die open_basedir-Beschränkung hervorgerufen - scheinbar verhindert open_basedir auch den Zugriff auf Dateien aus include-Verzeichnissen.
Wenn das so ist, dann finde ich das richtig. Den Include-Path kann man ja schließlich auch im Script verbiegen, was dann die open_basedir-Einschränkung konterkarieren würde.
Weiterhin darf "chmod 444 /usr/share/php -R" natürlich nicht aufgerufen werden, da Ausführ-Rechte für die Verzeichnisse existieren müssen! Am einfachsten ist es, man gibt allen 555 oder differenziert per find.
Achja, die Verzeichnisse. Die vergesse ich auch jedes Mal :-) Da ich aber nach einer (Massen-)Berechtigungsänderung immer nachsehe, ob sie wie gewünscht funktioniert hat fällt mir das dann aber gleich wieder auf.
echo "$verabschiedung $name";