PHP-Dienst Nginx kann nicht File_get_contents Problemumgehung verwenden.

Quelle: Internet
Autor: Benutzer
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

Kontaktiere uns

Die Inhaltsquelle dieser Seite ist aus dem Internet, und vertritt nicht die Meinung von Alibaba Cloud; auf dieser Seite erwähnte Produkte und Dienstleistungen haben keine Beziehung zu Alibaba Cloud. Wenn der Inhalt der Seite Ihrer Meinung nach verwirrend ist, schreiben sie uns bitte eine E-Mail. Wir werden das Problem innerhalb von 5 Tagen nach Erhalt Ihrer E-Mail bearbeiten.

Wenn Sie Fälle von Plagiaten aus der Community feststellen, senden Sie bitte eine E-Mail an info-contact@alibabacloud.com und legen Sie entsprechende Beweise vor. Ein Mitarbeiter wird Sie innerhalb von 5 Werktagen kontaktieren.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.