Heim > Backend-Entwicklung > PHP-Problem > So legen Sie das PHP-Curl-Timeout fest

So legen Sie das PHP-Curl-Timeout fest

藏色散人
Freigeben: 2023-03-03 12:20:02
Original
11065 Leute haben es durchsucht

So legen Sie das PHP-Curl-Timeout fest: 1. Verwenden Sie „curl_setopt($ch, opt)“, um einige Timeouts festzulegen. 2. Verwenden Sie „CURLOPT_DNS_CACHE_TIMEOUT“, um die Zeit zum Speichern von DNS-Informationen im Speicher festzulegen.

So legen Sie das PHP-Curl-Timeout fest

Empfohlen: „PHP-Tutorial

in PHP Bei Verwendung von Curl gibt es detaillierte Methoden zum Festlegen des Zeitlimits

Es gibt viele Möglichkeiten, auf HTTP zuzugreifen. Sie können Curl, Socket, file_get_contents() und andere Methoden verwenden.

Beim Zugriff auf http müssen Sie das Problem der Zeitüberschreitung berücksichtigen.

1. CURL greift auf HTTP zu

CURL ist eine häufig verwendete Bibliothek für den Zugriff auf die HTTP-Protokollschnittstelle. Sie verfügt über eine hohe Leistung und einige gleichzeitige Unterstützungsfunktionen.

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

*(Wichtig) CURLOPT_TIMEOUT legt die maximale Anzahl von Sekunden fest, die cURL ausführen darf.

*(Wichtig) 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 Wartezeit vor dem Herstellen einer Verbindung. 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 seit PHP 5.2.3)

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

1. Curl normales 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);   //只需要设置一个秒的数量就可以 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
Nach dem Login kopieren

2. Curl normales Timeout der zweiten Ebene:

curl_setopt($ch, CURLOPT_TIMEOUT,60);
Nach dem Login kopieren

3 hinzufügen:

curl_easy_setopt(curl, CURLOPT_NOSIGNAL,1L); 
//或者 
curl_setopt ( $ch,  CURLOPT_NOSIGNAL,true);//支持毫秒级别超时设置
Nach dem Login kopieren

Beispiel für die Curl-Timeout-Einstellung.

1, Beispiel für eine Millisekunden-Zeitüberschreitung in Curl:

<?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.";  
}
Nach dem Login kopieren

Tipps:

1, cURL-Version >= libcurl/7.21.0-Version, Millisekunden-Zeitüberschreitung ist sicher Effektiv, erinnern.

2. Das Timeout-Problem auf Millisekundenebene von curl_multi ist ungenau, wenn mehrere Benutzer gleichzeitig angepasst werden.

2. Zugriff auf HTTP über Stream-Verarbeitung

Zusätzlich zu Curl werden häufig fsockopen- oder Dateioperationsfunktionen zur Verarbeitung des HTTP-Protokolls verwendet.

Lassen Sie uns diesbezüglich über die Timeout-Einstellungen sprechen.

Das allgemeine Verbindungs-Timeout kann direkt festgelegt werden, das Stream-Lese-Timeout muss jedoch separat behandelt werden.

Sie können sich auf den folgenden Implementierungscode beziehen:

<?php
$tmCurrent = gettimeofday();  
       $intUSGone =($tmCurrent[&#39;sec&#39;]- $tmStart[&#39;sec&#39;])*1000000  
                  +($tmCurrent[&#39;usec&#39;]- $tmStart[&#39;usec&#39;]);  
       if($intUSGone > $this->_intReadTimeoutUS){  
           returnfalse;  
       }
Nach dem Login kopieren

oder die integrierten Stream-Verarbeitungsfunktionen stream_set_timeout() und stream_get_meta_data() verwenden, um Folgendes zu verarbeiten:

<?php
// Timeout in seconds   
$timeout =5;   
$fp = fsockopen("example.com",80, $errno, $errstr, $timeout);if($fp){   
        fwrite($fp,"GET / HTTP/1.0\r\n");   
        fwrite($fp,"Host: example.com\r\n");   
        fwrite($fp,"Connection: Close\r\n\r\n");   
        stream_set_blocking($fp,true);   //重要,设置为非阻塞模式  
        stream_set_timeout($fp,$timeout);   //设置超时  
        $info = stream_get_meta_data($fp);   
        while((!feof($fp))&&(!$info[&#39;timed_out&#39;])){   
                $data .= fgets($fp,4096);   
                $info = stream_get_meta_data($fp);   
                ob_flush;   
                flush();   
        }   
        if($info[&#39;timed_out&#39;]){   
                echo "Connection Timed Out!";   
        }else{   
                echo $data;   
        }}
Nach dem Login kopieren

file_get_contents timeout :

<?php
$timeout = array(  
    &#39;http&#39;=> array(  
        &#39;timeout&#39;=>5//设置一个超时时间,单位为秒  
    )  
);  
$ctx = stream_context_create($timeout);  
$text = file_get_contents("http://example.com/",0, $ctx);
Nach dem Login kopieren

fopen timeout:

<?php
$timeout = array(  
   &#39;http&#39; => array(  
       &#39;timeout&#39; => 5 //设置一个超时时间,单位为秒  
   )  
);  
  
$ctx = stream_context_create($timeout);  
  
if ($fp = fopen("http://example.com/", "r", false, $ctx)) {  
 while( $c = fread($fp, 8192)) {  
   echo $c;  
 }  
 fclose($fp);  
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo legen Sie das PHP-Curl-Timeout fest. 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