Heim > Artikel > Backend-Entwicklung > Die Funktion „File_get_contents“ fügt eine Timeout-Einstellung hinzu
In der tatsächlichen PHP-Entwicklung verwenden wir häufig die Funktion file_get_contents, um den von der Remote-Seite zurückgegebenen Inhalt abzurufen. Wenn die Remote-Antwortzeit jedoch sehr langsam ist, bleibt file_get_contents() immer dort hängen und tritt keine Zeitüberschreitung auf Diesmal stellen wir manchmal fest, dass die Systemlast des Linux-Servers des Webdienstes plötzlich zunimmt. Überprüfen Sie mit dem Befehl top, ob die CPU-Auslastung vieler PHP-CGI-Prozesse nahezu 100 % beträgt.
Wir wissen, dass es in php.ini einen Parameter max_execution_time gibt, der die maximale Ausführungszeit von PHP-Skripten festlegen kann. In php-cgi (php-fpm) wird dieser Parameter jedoch nicht wirksam. Was die maximale Ausführungszeit eines PHP-Skripts wirklich steuern kann, ist der folgende Parameter in der Konfigurationsdatei php-fpm.conf:
C-Code
Das Timeout (in Sekunden) für die Bereitstellung eines einzelnen Anfrage, nach der der Arbeitsprozess beendet wird
Sollte verwendet werden, wenn die INI-Option „max_execution_time“ aus irgendeinem Grund die Skriptausführung nicht stoppt
„0“ bedeutet „aus“
85a5ad964406a59de25a1814c1109cc10s4b175f9a50d57c75316becd702e959dc
Der Standardwert ist 0 Sekunden, was bedeutet, dass das PHP-Skript weiterhin ausgeführt wird. Wenn also alle PHP-CGI-Prozesse in der Funktion file_get_contents() hängen bleiben, kann dieser Webserver keine neuen PHP-Anfragen mehr verarbeiten. Es ist jedoch erforderlich, diesen Parameter zu ändern und die maximale Ausführungszeit eines PHP-Skripts festzulegen Behandelt nur die Symptome, nicht aber die Grundursache. Wenn es beispielsweise in 85a5ad964406a59de25a1814c1109cc130s4b175f9a50d57c75316becd702e959dc geändert wird und file_get_contents() langsam Webinhalte abruft, bedeutet dies, dass 150 PHP-CGI-Prozesse nur 5 Dateien pro Sekunde verarbeiten können .Anfrage, WebServer ist auch schwer zu vermeiden „502 Bad Gateway“.
Um eine vollständige Lösung zu erreichen, besteht die einzige Möglichkeit für PHP-Programmierer darin, die Gewohnheit zu ändern, file_get_contents("http://example.com/") direkt zu verwenden, und stattdessen eine geringfügige Änderung vorzunehmen und eine Zeitüberschreitung hinzuzufügen . Verwenden Sie die folgende Methode, um HTTP-GET-Anfragen zu implementieren. Wenn Sie Schwierigkeiten damit haben, können Sie den folgenden Code selbst in eine Funktion kapseln.
<?php $ctx = stream_context_create(array( 'http' => array( 'timeout' => 1 //设置一个超时时间,单位为秒 ) ) ); file_get_contents("http://example.com/", 0, $ctx); ?>