Eine lokalen Entwicklungsumgebung Service entstand in einer Windows-Umgebung mit Nginx, um den Dienst zu tun aber mit File_get_contents () um eine lokale Verbindung ist ein Fehler aufgetreten, und der folgende Artikel zeigt Ihnen, wie das Problem zu beheben.
I. Beschreibung des Problems
Eine lokalen Entwicklungsumgebung Service wurde in einer Windows-Umgebung mit Nginx, um den Dienst zu tun, aber dieser Fehler aufgetreten ist, wenn Sie verwendet, um eine lokale Verbindung http://127.0.0.1/index.php File_get_contents ():
file_get_contents(http://127.0.0.1/index.php) [<a href='function.file-get-contents'>function.file-get-contents</a>]: failed to open stream: HTTP request failed!
Lokalen Computer PHP-Umgebung ist: Nginx + Php + Mysql; also diesen Artikel eine Notiz aufzeichnen zu finden!
Diese zwei Tage haben in Windows unter NGINX + FASTCGI File_get_contents Anfrage engagiert. Ich denke, viele Studenten haben keinen Druck stoßen, wenn File_get_contents Http/Https-PHP-Dateien aus dem extranet, wie z. B. Echo File_get_contents (http://www.baidu.com), anfordert Es wird Baidu Seite zeigen. Aber wenn Sie PHP Dienstleistungen localhost/127.0.0.1 des lokalen Netzwerks anfordern, es ist immer Timeout, und man kann nicht wieder Daten, z. B. File_get_contents ("http://localhost/phpinfo.php"), egal wie lange Sie die Zeit und das Skript ausführen anfordern werden. Wenn Sie versuchen, eine statische Datei wie z. B. HTML anfordern, ist es jedoch kein Problem überhaupt. Woran liegt das?!
Zunächst einmal wissen wir, dass wenn File_get_contents/Curl/Fopen eine TCP/IP-basierte HTTP-Anforderung öffnet, Anforderungsdaten, um Nginx gesendet werden und Nginx an Php-Cgi (Fastcgi) delegiert ist, die PHP-Datei verarbeiten, In der Regel veröffentlichen FastCGI sofort das Ende-Signal nach Verarbeitung eine PHP anfordern, warten auf die nächste Anforderung Verarbeitung (und natürlich nimmt das Programm geschieden, Ressourcen). Offene nginx.conf, sehen wir 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;}
Da oben klar ist, alle Dateien, die das Ende von PHP zu verwenden sind Fastcgi verarbeitet, und es gibt einen Satz in der Konfigurationsdatei php.ini:
cgi.force_redirect = 1
Gibt an, dass alle PHP-Programme sicher zwingen die Lenkung CGI Verarbeitung übergeben werden.
Aber in Windows, wie die lokalen 127.0.0.1:9000 bezieht sich auf Php-Cgi?! Die Antwort ist einen Php-Cgi-Prozess hinzufügen, der es verwendet, um für 127.0.0.1:9000 zu hören. Über den Controller-Befehl:
RunHiddenConsole.exe D:/www/php/php-cgi.exe -b 127.0.0.1:9000 -c C:/WINDOWS/php.ini
Schalten wir einen Php-cgi.exe-Prozess für Anfragen von 127.0.0.1:9000 zu hören, wenn Windows gestartet wird. Wenn Sie Netstat – a unter dem DOS-Befehl öffnen, können Sie sehen, dass die 9000-Port unter dem lokalen Computer in Überwachungszustand ist (d. h. frei, wenn kein Antrag wird gesendet).
Nun, ist es Zeit zu reden, warum Sie Ergebnisse zurückkehren können, wenn Sie die File_get_contents () (Curl), Fopen ()-Funktion verwenden auf "localhost" in PHP zugreifen. Lassen Sie uns versuchen index.php File_get_contents ("http://127.0.0.1/phpinfo.php") hinzu. Anweisung sendet eine Anforderung an phpinfo.php, wo die Statusanzeige im Browser hat Spinnen, darauf hinweist, dass es gearbeitet hat. Öffnen Sie den Befehl Netstat in Dos und Sie können sehen, dass der Status des lokalen Ports 9000: etabliert, was darauf hinweist, dass der Prozess in der Online-Verarbeitung. In der Tat, sandten hier zwei HTTP-basierte PHP-Anträge auf Nginx zur gleichen Zeit wir, Man ist das Parsen index.php, und der andere ist phpinfo.php, so der Widerspruch kommt, weil unser Windowssystem nur ein HTTP-Prozess lädt, sodass zwei PHP Anfragen gleichzeitig verarbeitet werden können, kann es nur verarbeiten, die erste Anforderung (index.php) und index.php Beim warten auf das Ergebnis phpinfo.php niemand verarbeiten phpinfo.php es die Anforderung zu verarbeiten hilft, weil es auf index.php, lassen Sie das Ende-Signal gewartet hat, wodurch das Programm zu blockieren Sie den Zustand und in einer toten Schleife fallen. So sahen wir, dass der Browser Status bedeutet, dass es ständig Spinnen war. Curl () hat den gleichen Grund wie die Funktion Fopen.
II. Lösungen
Wenn wir den Grund finden, haben wir eine Lösung.
Gehört zu eine HTTP-Anforderung zum System hinzuzufügen, die zuteilen können zusätzliche PHP-Anfragen zu anderen HTTP verarbeiten, wenn eine weitere Anforderung innerhalb eines Php-Cig geladen wird. An dieser Stelle müssen Sie eine andere zuweisen Port auf einen anderen HTTP Server, wie 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; }
Auf diese Weise können die Ports 80 und 8080 verschiedene Programme behandeln getrennt, wie z.B.:
Test.php
echo file_get_contents('http://localhost:8080/phpinfo.php');
Natürlich gibt es mehr Möglichkeiten unter * Unix, wie Gabel.
Darüber hinaus einige Leute im Internet gesagt, entfernen Sie die Adresse des http://protocol Tags und die Verwendung von relativen Adresse auf die Umgehung der Funktion des Schecks, die tatsächliche Situation nicht so?! Wenn in index.php File_get_contents ("phpinfo.php") verwendet wird; , Können wir sehen, dass die Funktion gibt den Source-Code der phpinfo.php, File_get_contents ('File:c:wwwphpinfo.php'); entspricht , Es liest eigentlich nur Ihre Textinhalte, da die File_get_contents ()-Funktion zunächst das Dateiprotokoll, während Locke verarbeitet, direkt Fehler können nicht behoben werden. Diese Menschen sind rein verlernt Lügner.
Es wurde auch vorgeschlagen, das Gastgeber-Dokument hinzufügen "localhost" ändern Www.xxx.com Anspielungen Beziehung, Funktion durch den www.xxx.com Zugang zu den lokalen PHP, von denen in der Tat keine Heilung ist, denn dies ist nur für den Computer analysieren, die endgültige www.xxx.com auf 127.0.0.1, und die letzteren, die nur HTTP, DNS oder blockieren.
Entsprechenden Empfehlungen:
Problemumgehung, die die File_get_contents Funktion nicht verwenden
Wie PHP mit Nginx-Server verbindet und löst das Nginx-Protokoll