Maison  >  Article  >  développement back-end  >  Comment définir le délai d'expiration de PHP Curl

Comment définir le délai d'expiration de PHP Curl

藏色散人
藏色散人original
2020-07-28 10:49:0210709parcourir

Comment définir le délai d'expiration de php curl : 1. Utilisez "curl_setopt($ch, opt)" pour définir certains délais d'attente ; 2. Utilisez "CURLOPT_DNS_CACHE_TIMEOUT" pour définir l'heure de sauvegarde des informations DNS en mémoire.

Comment définir le délai d'expiration de PHP Curl

Recommandé : "Tutoriel PHP"

en php Lorsque vous utilisez curl, il existe des méthodes détaillées pour définir le délai d'attente

Il existe de nombreuses façons d'accéder à HTTP, vous pouvez utiliser curl, socket, file_get_contents() et d'autres méthodes.

Lorsque vous accédez à http, vous devez prendre en compte le problème du délai d'attente.

1. CURL accède à HTTP

CURL est une bibliothèque lib couramment utilisée pour accéder à l'interface du protocole HTTP. Elle a des performances élevées et certaines fonctions de support simultanées.

curl_setopt($ch, opt) peut définir certains paramètres de délai d'attente, notamment :

*(Important) CURLOPT_TIMEOUT définit le nombre maximum de secondes pendant lesquelles cURL est autorisé à s'exécuter.

*(Important) CURLOPT_TIMEOUT_MS définit le nombre maximum de millisecondes pendant lequel cURL est autorisé à s'exécuter.

(Ajouté dans cURL 7.16.2. Disponible à partir de PHP 5.2.3)

CURLOPT_CONNECTTIMEOUT Le temps d'attente avant d'initier une connexion S'il est défini sur 0, il attendra indéfiniment.

CURLOPT_CONNECTTIMEOUT_MS Le temps d'attente pour une tentative de connexion, en millisecondes. S'il est défini sur 0, attendez indéfiniment.

(Ajouté dans cURL 7.16.2. Disponible depuis PHP 5.2.3)

CURLOPT_DNS_CACHE_TIMEOUT Définissez l'heure de sauvegarde des informations DNS en mémoire, la valeur par défaut est de 120 secondes.

1. Curl délai d'attente normal de deuxième niveau :

$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']);

2. Utilisation du délai d'attente normal de deuxième niveau :

curl_setopt($ch, CURLOPT_TIMEOUT,60);

3. Si curl nécessite un délai d'attente d'une milliseconde, vous devez le faire. ajoutez :

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

Exemple de paramètre de délai d'expiration de curl.

1, exemple de délai d'attente en millisecondes dans 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.";  
}

Astuces :

1, version cURL >= version libcurl/7.21.0, le délai d'attente en millisecondes est certain Efficace, souviens-toi.

2. Le problème de délai d'attente au niveau de la milliseconde de curl_multi. Un seul accès prend en charge le délai d'attente au niveau de la milliseconde. Curl_multi sera inexact lors de l'ajustement de plusieurs utilisateurs en parallèle.

2. Accédez à HTTP via le traitement de flux

En plus de curl, les fonctions fsockopen ou d'opération de fichier sont souvent utilisées pour traiter le protocole HTTP.

Parlons des paramètres de délai d'attente à cet égard.

Le délai d'expiration général de la connexion peut être défini directement, mais le délai d'expiration de la lecture du flux doit être géré séparément.

Vous pouvez vous référer au code d'implémentation suivant :

<?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;  
       }

ou utiliser les fonctions de traitement de flux intégrées stream_set_timeout() et stream_get_meta_data() pour traiter :

<?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;   
        }}

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);

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);  
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn