In PHP - Skripte, ob Aufruf include()
, require()
, fopen()
, oder deren Derivate, wie include_once
, require_once
oder sogar, move_uploaded_file()
läuft man oft in einen Fehler oder eine Warnung:
Fehler beim Öffnen des Streams: Keine solche Datei oder kein solches Verzeichnis.
Was ist ein guter Prozess, um die Grundursache des Problems schnell zu finden?
php
require
fopen
include-path
Vic Seedoubleyew
quelle
quelle
Antworten:
Es gibt viele Gründe, warum dieser Fehler auftreten kann, und daher hilft eine gute Checkliste, was zuerst überprüft werden muss, erheblich.
Nehmen wir an, wir beheben die folgende Zeile:
Checkliste
1. Überprüfen Sie den Dateipfad auf Tippfehler
oder verschieben Sie alles, was von
require*
oderinclude*
in eine eigene Variable aufgerufen wird , geben Sie es wieder, kopieren Sie es und versuchen Sie, von einem Terminal aus darauf zuzugreifen:Dann in einem Terminal:
2. Überprüfen Sie, ob der Dateipfad in Bezug auf relative und absolute Pfadüberlegungen korrekt ist
/users/tony/htdocs
Empfohlene Vorgehensweise :
Um Ihr Skript robust zu machen, falls Sie Dinge verschieben und gleichzeitig zur Laufzeit einen absoluten Pfad generieren, haben Sie zwei Möglichkeiten:
require __DIR__ . "/relative/path/from/current/file"
. Die__DIR__
magische Konstante gibt das Verzeichnis der aktuellen Datei zurück.Definieren Sie selbst eine
SITE_ROOT
Konstante:config.php
in
config.php
, schreibeFügen Sie in jede Datei, in der Sie auf den Site-Stammordner verweisen möchten,
config.php
dieSITE_ROOT
Konstante ein und verwenden Sie sie, wo immer Sie möchten :Diese beiden Methoden machen Ihre Anwendung auch portabler, da sie nicht auf INI-Einstellungen wie dem Include-Pfad basiert.
3. Überprüfen Sie Ihren Include-Pfad
Eine andere Möglichkeit, Dateien weder relativ noch rein absolut einzuschließen , besteht darin, sich auf den Einschlusspfad zu verlassen . Dies ist häufig bei Bibliotheken oder Frameworks wie dem Zend-Framework der Fall.
Eine solche Aufnahme sieht folgendermaßen aus:
In diesem Fall sollten Sie sicherstellen, dass der Ordner, in dem sich "Zend" befindet, Teil des Include-Pfads ist.
Sie können den Include-Pfad überprüfen mit:
Sie können einen Ordner hinzufügen mit:
4. Überprüfen Sie, ob Ihr Server Zugriff auf diese Datei hat
Es kann sein, dass der Benutzer, der den Serverprozess ausführt (Apache oder PHP), einfach keine Berechtigung zum Lesen oder Schreiben in diese Datei hat.
Um zu überprüfen, unter welchem Benutzer der Server ausgeführt wird, können Sie posix_getpwuid verwenden :
Geben Sie den folgenden Befehl in das Terminal ein, um die Berechtigungen für die Datei herauszufinden:
und schauen Sie sich die symbolische Notationsnotation an
5. Überprüfen Sie die PHP-Einstellungen
Wenn keines der oben genannten Verfahren funktioniert hat, besteht das Problem wahrscheinlich darin, dass einige PHP-Einstellungen den Zugriff auf diese Datei untersagen.
Drei Einstellungen könnten relevant sein:
phpinfo()
oder durch Verwenden überprüft werdenini_get("open_basedir")
ini_get("allow_url_include")
und eingestellt werdenini_set("allow_url_include", "1")
Eckkoffer
Wenn keine der oben genannten Optionen zur Diagnose des Problems aktiviert ist, können folgende spezielle Situationen auftreten:
1. Die Aufnahme einer Bibliothek unter Verwendung des Einschlusspfads
Es kann vorkommen, dass Sie eine Bibliothek, z. B. das Zend-Framework, über einen relativen oder absoluten Pfad einschließen. Zum Beispiel :
Aber dann erhalten Sie immer noch die gleiche Art von Fehler.
Dies kann passieren, weil die Datei, die Sie (erfolgreich) aufgenommen haben, selbst eine include-Anweisung für eine andere Datei hat und diese zweite include-Anweisung davon ausgeht, dass Sie den Pfad dieser Bibliothek zum include-Pfad hinzugefügt haben.
Die zuvor erwähnte Zend-Framework-Datei kann beispielsweise Folgendes enthalten:
Dies ist weder eine Einbeziehung durch den relativen Pfad noch durch den absoluten Pfad. Es wird davon ausgegangen, dass das Zend-Framework-Verzeichnis zum Include-Pfad hinzugefügt wurde.
In einem solchen Fall besteht die einzige praktische Lösung darin, das Verzeichnis zu Ihrem Include-Pfad hinzuzufügen.
2. SELinux
Wenn Sie Security-Enhanced Linux ausführen, kann dies der Grund für das Problem sein, indem Sie den Zugriff auf die Datei vom Server aus verweigern.
Führen Sie den
sestatus
Befehl in einem Terminal aus, um zu überprüfen, ob SELinux auf Ihrem System aktiviert ist . Wenn der Befehl nicht vorhanden ist, befindet sich SELinux nicht auf Ihrem System. Wenn es existiert, sollte es Ihnen sagen, ob es erzwungen wird oder nicht.Um zu überprüfen, ob SELinux-Richtlinien der Grund für das Problem sind, können Sie versuchen, es vorübergehend zu deaktivieren. Seien Sie jedoch VORSICHTIG, da dadurch der Schutz vollständig deaktiviert wird. Tun Sie dies nicht auf Ihrem Produktionsserver.
Wenn Sie das Problem mit SELinux nicht mehr deaktiviert haben, ist dies die Hauptursache.
Um dies zu lösen , müssen Sie SELinux entsprechend konfigurieren.
Folgende Kontexttypen sind erforderlich:
httpd_sys_content_t
für Dateien, die Ihr Server lesen sollhttpd_sys_rw_content_t
für Dateien, auf die Sie Lese- und Schreibzugriff wünschenhttpd_log_t
für Protokolldateienhttpd_cache_t
für das Cache-Verzeichnishttpd_sys_content_t
Führen Sie beispielsweise Folgendes aus, um den Kontexttyp Ihrem Website-Stammverzeichnis zuzuweisen :Wenn sich Ihre Datei in einem Home-Verzeichnis befindet, müssen Sie auch den
httpd_enable_homedirs
Booleschen Wert aktivieren:In jedem Fall kann es verschiedene Gründe geben, warum SELinux abhängig von Ihren Richtlinien den Zugriff auf eine Datei verweigert. Sie müssen sich also danach erkundigen. Hier finden Sie ein Tutorial speziell zum Konfigurieren von SELinux für einen Webserver.
3. Symfony
Wenn Sie Symfony verwenden und dieser Fehler beim Hochladen auf einen Server auftritt, wurde der Cache der App möglicherweise nicht zurückgesetzt, entweder weil
app/cache
er hochgeladen wurde oder der Cache nicht gelöscht wurde.Sie können dies testen und beheben, indem Sie den folgenden Konsolenbefehl ausführen:
4. Nicht-ACSII-Zeichen in der Zip-Datei
Anscheinend kann dieser Fehler auch beim Aufrufen auftreten,
zip->close()
wenn einige Dateien in der Zip-Datei Nicht-ASCII-Zeichen in ihrem Dateinamen enthalten, z. B. "é".Eine mögliche Lösung besteht darin, den Dateinamen
utf8_decode()
vor dem Erstellen der Zieldatei einzuschließen.Dank an Fran Cano für die Identifizierung und den Lösungsvorschlag für dieses Problem
quelle
selinux
hier eine gute Idee sein kann. Sie benötigen mindestens die Berechtigunghttpd_sys_content_t
(schreibgeschützte Verzeichnisse und von Apache verwendete Dateien) für die enthaltenen Dateien.chcon
ist vorübergehend und überlebt einenrestorecon
oder einen Neustart nicht. Möglicherweise müssen Sie verwendensemanage
, um den Kontext der Datei zu ändern. Hier ist ein gutes einfaches Tutorial für die WebsiteZur (wirklich guten) bestehenden Antwort hinzufügen
Shared Hosting Software
open_basedir
ist eine, die Sie überraschen kann, weil sie in einer Webserverkonfiguration angegeben werden kann. Während dies leicht behoben werden kann, wenn Sie Ihren eigenen dedizierten Server betreiben, gibt es einige gemeinsam genutzte Hosting-Softwarepakete (wie Plesk, cPanel usw.), die eine Konfigurationsanweisung auf Domänenbasis konfigurieren. Da die Software die Konfigurationsdatei erstellt (dhhttpd.conf
), können Sie diese Datei nicht direkt ändern, da die Hosting-Software sie beim Neustart nur überschreibt.Mit Plesk bieten sie einen Ort , der bereitgestellte außer Kraft zu setzen
httpd.conf
genanntvhost.conf
. Nur der Serveradministrator kann diese Datei schreiben. Die Konfiguration für Apache sieht ungefähr so ausLassen Sie Ihren Serveradministrator das Handbuch für die von ihm verwendete Hosting- und Webserver-Software konsultieren.
Dateiberechtigungen
Es ist wichtig zu beachten, dass sich die Ausführung einer Datei über Ihren Webserver stark von der Ausführung einer Befehlszeile oder eines Cron-Jobs unterscheidet. Der große Unterschied besteht darin, dass Ihr Webserver über eigene Benutzer und Berechtigungen verfügt. Aus Sicherheitsgründen ist dieser Benutzer ziemlich eingeschränkt. Apache, zum Beispiel, ist oft
apache
,www-data
oderhttpd
(je nach Server). Ein Cron-Job oder eine CLI-Ausführung verfügt über alle Berechtigungen, über die der Benutzer verfügt (dh das Ausführen eines PHP-Skripts als Root wird mit den Berechtigungen von Root ausgeführt).Häufig lösen Benutzer ein Berechtigungsproblem wie folgt (Linux-Beispiel)
Dies ist keine kluge Idee, da die Datei oder das Verzeichnis jetzt weltweit beschreibbar ist. Wenn Sie den Server besitzen und der einzige Benutzer sind, ist dies keine große Sache. Wenn Sie sich jedoch in einer gemeinsam genutzten Hosting-Umgebung befinden, haben Sie gerade allen Benutzern Ihres Servers Zugriff gewährt.
Sie müssen lediglich die Benutzer ermitteln, die Zugriff benötigen, und nur diesen Benutzern Zugriff gewähren. Sobald Sie wissen, welche Benutzer Zugriff benötigen, möchten Sie dies sicherstellen
Dieser Benutzer besitzt die Datei und möglicherweise das übergeordnete Verzeichnis (insbesondere das übergeordnete Verzeichnis, wenn Sie Dateien schreiben möchten). In den meisten gemeinsam genutzten Hosting-Umgebungen ist dies kein Problem, da Ihr Benutzer alle Dateien unter Ihrem Stammverzeichnis besitzen sollte. Ein Linux-Beispiel ist unten gezeigt
Der Benutzer und nur dieser Benutzer hat Zugriff. Unter Linux wäre eine gute Vorgehensweise
chmod 600
(nur der Besitzer kann lesen und schreiben) oderchmod 644
(der Besitzer kann schreiben, aber jeder kann lesen).Sie können eine erweiterte Diskussion über Linux / Unix - Rechte und Benutzer lesen Sie hier
quelle
Mein Code funktionierte auf allen Computern einwandfrei, aber nur auf diesem gab es Probleme (was früher funktioniert hat, denke ich). Verwendete Echo "document_root" Pfad zum Debuggen und sah sich auch den Fehler genau an, fand dies
Sie können leicht erkennen, wo die Probleme liegen. Die Probleme sind // vor Funktionen
Entfernen Sie einfach die Ladung / aus dem Include und es sollte gut funktionieren. Interessant ist, dass dieses Verhalten in verschiedenen Versionen unterschiedlich ist. Ich habe den gleichen Code auf Laptop, Macbook Pro und diesem PC ausgeführt, alles hat einwandfrei funktioniert, bis. Hoffe das hilft jemandem.
quelle
Skript mit Abfrageparametern hinzufügen
Das war mein Fall. Es ist tatsächlich mit der Frage Nr. 4485874 verknüpft , aber ich werde es hier in Kürze erklären.
Wenn Sie versuchen, dies zu fordern
path/to/script.php?parameter=value
, sucht PHP nach einer Datei mit dem Namenscript.php?parameter=value
, da Sie unter UNIX solche Pfade verwenden können.Wenn Sie wirklich brauchen , sind einige Daten enthalten Skript übergeben, erklären es einfach als
$variable=...
oder$GLOBALS[]=...
oder andere Art und Weise Sie mögen.quelle
Samba-Aktien
Wenn Sie einen Linux-Testserver haben und von einem Windows-Client aus arbeiten, stört die Samba-Freigabe den Befehl chmod . Also, auch wenn Sie verwenden:
Auf der Linux-Seite ist es durchaus möglich, dass die Unix Group \ www-data noch keinen Schreibzugriff hat. Eine funktionierende Lösung, wenn Ihre Freigabe so eingerichtet ist, dass Windows-Administratoren dem Stamm zugeordnet sind: Öffnen Sie unter Windows die Berechtigungen, deaktivieren Sie die Vererbung für Ihren Ordner mit Kopie und gewähren Sie dann den vollständigen Zugriff für WWW-Daten.
quelle
Eine weitere mögliche Ursache: Umbenennen und / oder Verschieben von Dateien in einem Texteditor. Ich habe alle oben genannten Schritte ohne Erfolg ausgeführt, bis ich die Datei gelöscht habe, die diesen Fehler immer wieder ausgelöst hat, und eine neue erstellt habe, mit der das Problem behoben wurde.
quelle