Heim  >  Artikel  >  Backend-Entwicklung  >  So beheben Sie das Timeout der PHP-Anforderungsschnittstelle

So beheben Sie das Timeout der PHP-Anforderungsschnittstelle

王林
王林Original
2019-09-29 17:48:066239Durchsuche

So beheben Sie das Timeout der PHP-Anforderungsschnittstelle

[HTTP-Zugriff]

Im Allgemeinen greifen wir auf viele Arten auf HTTP zu, hauptsächlich: Curl, Socket, file_get_contents() und andere Methoden.

Wenn der Server der anderen Partei nie antwortet, geraten wir in eine Tragödie. Es ist leicht, den gesamten Server zu zerstören, daher müssen wir auch das Timeout-Problem beim Zugriff auf http berücksichtigen.

[CURL-Zugriff auf HTTP]

CURL ist eine häufig verwendete und zuverlässige Bibliothek für den Zugriff auf die HTTP-Protokollschnittstelle mit hoher Leistung und einigen Parallelitätsfunktionen usw.

CURL:

curl_setopt($ch, opt) kann einige Timeout-Einstellungen festlegen, hauptsächlich einschließlich:

CURLOPT_TIMEOUT Set Die maximale Anzahl an Sekunden, die cURL ausführen darf.

CURLOPT_TIMEOUT_MS legt die maximale Anzahl von Millisekunden fest, die cURL ausführen darf. (Hinzugefügt in cURL 7.16.2. Verfügbar ab PHP 5.2.3.)

CURLOPT_CONNECTTIMEOUT Die Zeit, die vor dem Herstellen einer Verbindung gewartet werden soll. Wenn auf 0 gesetzt, wird unendlich gewartet.

CURLOPT_CONNECTTIMEOUT_MS Die Zeit, die auf einen Verbindungsversuch gewartet wird, in Millisekunden. Wenn auf 0 gesetzt, unendlich warten. Hinzugefügt in cURL 7.16.2. Verfügbar ab PHP 5.2.3.

CURLOPT_DNS_CACHE_TIMEOUT legt die Zeit zum Speichern von DNS-Informationen im Speicher fest. Der Standardwert beträgt 120 Sekunden.

normales Curl-Timeout der zweiten Ebene:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_TIMEOUT, 60); //Sie müssen nur die Anzahl der Sekunden festlegen

curl_setopt( $ ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);

normale Curl-Timeout-Nutzung der zweiten Ebene:

curl_setopt($ch, CURLOPT_TIMEOUT, 60);

Wenn für Curl ein Millisekunden-Timeout erforderlich ist, müssen Sie Folgendes hinzufügen:

curl_easy_setopt( curl, CURLOPT_NOSIGNAL, 1L ; Ein Beispiel für Curl mit einem Millisekunden-Timeout:

<?php
if (!isset($_GET[&#39;foo&#39;])) {
    
// Client
    $ch = curl_init(&#39;http://example.com/&#39;);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);  
//注意,毫秒超时一定要设置这个
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); 
//超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用
    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);
 
    if ($curl_errno > 0) {
        echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
        echo "Data received: $data\n";
    }
} else {
    
// Server
    sleep(10);
    echo "Done.";
}
?>
Einige weitere Tipps:

1. Erfahrungsgemäß lautet die Zusammenfassung : cURL-Version >= libcurl/7.21, denken Sie daran, dass das Millisekunden-Timeout definitiv wirksam wird.

2. Es gibt auch ein Problem mit dem Millisekunden-Timeout von curl_multi. . Ein einzelner Zugriff unterstützt Timeout auf MS-Ebene, und curl_multi ist ungenau, wenn mehrere Aufrufe parallel erfolgen

[Zugriff auf HTTP über Stream-Verarbeitung]

Zusätzlich zu Curl , wir machen es oft auch selbst Verwenden Sie fsockopen oder die Dateioperationsfunktion, um das HTTP-Protokoll zu verarbeiten, daher ist auch unsere Timeout-Verarbeitung erforderlich.

Empfohlenes Tutorial:

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo beheben Sie das Timeout der PHP-Anforderungsschnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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