Der PHP-Dienst Nginx kann die Lösung file_get_contents nicht verwenden

不言
Freigeben: 2023-04-04 06:30:02
Original
3064 Leute haben es durchsucht

Ich habe eine lokale Entwicklungsdienstumgebung in einer Windows-Umgebung erstellt und Nginx als Dienst verwendet. Bei der Verwendung von file_get_contents() zum Abrufen des lokalen Links ist jedoch ein Fehler aufgetreten.

1. Beschreibung des Problems

Eine lokale Entwicklungsdienstumgebung wurde in einer Windows-Umgebung erstellt und Nginx wurde als Dienst verwendet. Bei Verwendung von file_get_contents() wurde jedoch der lokale Link http ://127.0.0.1/index.php, ein solcher Fehler ist aufgetreten:

file_get_contents(http://127.0.0.1/index.php) [<a href=&#39;function.file-get-contents&#39;>function.file-get-contents</a>]: failed to open stream: HTTP request failed!
Nach dem Login kopieren

Die PHP-Umgebung des lokalen Computers ist: nginx+php+mysql; also habe ich diesen Artikel gefunden und notiert, notieren Sie ihn!

In den letzten zwei Tagen habe ich file_get_contents-Anfragen für nginx+fastcgi unter Windows gestellt. Ich denke, dass viele Studenten keinen Druck verspüren, wenn file_get_contents http/https-PHP-Dateien im externen Netzwerk anfordert, z. B. echo file_get_contents („http://www.baidu.com“), das die Seite von Baidu anzeigt. Wenn Sie jedoch den PHP-Dienst im lokalen Netzwerk localhost/127.0.0.1 anfordern, wird immer eine Zeitüberschreitung angezeigt. Unabhängig davon, wie lange Sie die Anforderungszeit und die Skriptlaufzeit festlegen, können Sie keine Daten zurückgeben, z. B. file_get_contents('http: //localhost/phpinfo.php' ). Es gibt jedoch überhaupt kein Problem, wenn Sie versuchen, statische Dateien wie HTML anzufordern. Was ist der Grund? !

Zunächst wissen wir, dass, wenn file_get_contents/curl/fopen eine HTTP-Anfrage basierend auf TCP/IP öffnet, die Anfragedaten an Nginx gesendet werden und Nginx PHP-CGI (Fastcgi) mit der Verarbeitung von PHP beauftragt Im Allgemeinen gibt fastcgi nach der Verarbeitung einer PHP-Anfrage sofort das Endsignal aus und wartet auf die nächste Verarbeitungsanforderung (natürlich gibt es auch Fälle, in denen das Programm einfriert und weiterhin Ressourcen belegt). Öffnen Sie nginx.conf, wir sehen die folgende Zeile:

location ~ .php {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  d:/www/htdocs$fastcgi_script_name;
        include        fastcgi_params;
}
Nach dem Login kopieren

Oben wurde deutlich gesehen, dass alle Dateien, die mit php enden, von fastcgi verarbeitet werden, und es gibt auch einen Satz in der Konfigurationsdatei php.ini:

cgi.force_redirect = 1
Nach dem Login kopieren

gibt an, dass alle PHP-Programme die Umleitung zu CGI sicher erzwingen können.

Aber wie kontaktiert lokal 127.0.0.1:9000 unter Windows PHP-CGI? ! Die Antwort besteht darin, einen PHP-CGI-Prozess hinzuzufügen und ihn zum Abhören von 127.0.0.1:9000 zu verwenden. Über den Controller-Befehl:

RunHiddenConsole.exe D:/www/php/php-cgi.exe  -b 127.0.0.1:9000 -c C:/WINDOWS/php.ini
Nach dem Login kopieren

können wir einen php-cgi.exe-Prozess starten, um Anfragen von 127.0.0.1:9000 beim Starten von Windows zu überwachen. Öffnen Sie netstat -a unter dem Befehl dos und Sie können sehen, dass sich Port 9000 unter dem lokalen Computer im Überwachungsstatus befindet (d. h. leer, wenn keine Anfrage gesendet wird).

Okay, es ist Zeit, darüber zu sprechen, warum die Ergebnisse nicht zurückgegeben werden können, wenn die Funktionen file_get_contents(), curl() und fopen() in PHP verwendet werden, um auf localhost zuzugreifen. Versuchen wir, die Anweisung file_get_contents('http://127.0.0.1/phpinfo.php') zu index.php hinzuzufügen, um eine Anfrage an phpinfo.php zu senden. Zu diesem Zeitpunkt dreht sich die Statusanzeige im Browser weiter und zeigt dies an war bei der Arbeit. Öffnen Sie den Befehl netstat in Dos. Sie können sehen, dass der Status des lokalen 9000-Ports ESTABLISHED lautet, was darauf hinweist, dass der Prozess online verarbeitet wird. Tatsächlich haben wir hier zwei http-basierte PHP-Anfragen gleichzeitig an Nginx gesendet, eine zum Parsen von index.php und die andere für phpinfo.php, sodass ein Widerspruch auftritt, da unser Windows-System nur ein http lädt Daher kann er nicht zwei PHP-Anfragen gleichzeitig verarbeiten. Er kann nur die erste Anfrage (index.php) zuerst verarbeiten, während index.php auf das Verarbeitungsergebnis von phpinfo.php wartet und niemand ihm hilft phpinfo.php verarbeiten, da es darauf gewartet hat, dass index.php das Endsignal freigibt, wodurch das Programm blockiert wird und in eine Endlosschleife gerät. Wir sehen also, dass sich die Statusanzeige des Browsers ständig dreht. Der Grund für Curl() und die fopen-Funktion ist der gleiche.

2. Lösung

Sobald wir den Grund gefunden haben, haben wir auch eine Lösung.

Fügen Sie zunächst eine http-Anfrage zum System hinzu. Wenn eine andere Anfrage in eine PHP-Datei geladen wird, kann diese eine andere HTTP-Anfrage für die Bearbeitung der zusätzlichen PHP-Anfrage zuweisen. Zu diesem Zeitpunkt müssen Sie einem anderen HTTP-Server einen anderen Port zuweisen, z. B. 8080. Der Fall von Nginx ist wie folgt:

http {  
    server {  
        listen          80;  
        server_name     127.0.0.1;  
        location / {  
            index index.php;  
            root  /web/www/htdocs;  
        }  
    }  
    server {  
        listen          8080;  
        server_name     127.0.0.1;  
        location / {  
            index index.html;  
            root  /web/www/htdocs;  
        }  
    }  
    include    /opt/nginx/conf/vhosts/php.conf;  
}
Nach dem Login kopieren

Auf diese Weise können die Ports 80 und 8080 jeweils unterschiedliche Programme verarbeiten, wie zum Beispiel:
test.php

 echo file_get_contents('http://localhost:8080/phpinfo.php');
Nach dem Login kopieren

Natürlich gibt es solche Weitere Optionen unter *unix , z. B. fork.

Zur Erinnerung: Einige Leute im Internet sagten, dass durch das Entfernen der http://-Protokollmarkierung in der Adresse und die Verwendung relativer Adressen Funktionsprüfungen umgangen werden können. Ist dies tatsächlich der Fall? ! Bei Verwendung von file_get_contents('phpinfo.php'); in index.php können wir sehen, dass die Funktion den Quellcode von phpinfo.php ausgibt, was file_get_contents('file:c:wwwphpinfo.php'); entspricht Tatsächlich liest das Obige nur Ihren Textinhalt, da die Funktion file_get_contents() zuerst das Dateiprotokoll verarbeitet und Curl direkt einen Fehler meldet und nicht analysiert werden kann. Deshalb sind diese Leute einfach ungebildete Lügner.

Einige Leute haben auch vorgeschlagen, die Hosts-Datei zu ändern und die Anspielungsbeziehung „localhost www.xxx.com“ hinzuzufügen. Die Funktion greift über www.xxx.com auf das lokale PHP zu Grundursache, da es nur die DNS-Auflösung des Computers erleichtert, wird schließlich www.xxx.com an 127.0.0.1 übergeben, und letzteres wird an das einzige noch blockierte http übergeben.

Verwandte Empfehlungen:

Lösung für das Problem, dass die Funktion file_get_contents nicht verwendet werden kann

So verbinden Sie den Nginx-Server mit PHP und analysieren Nginx-Protokolle

Das obige ist der detaillierte Inhalt vonDer PHP-Dienst Nginx kann die Lösung file_get_contents nicht verwenden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!