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

藏色散人
Libérer: 2023-03-03 12:20:02
original
10949 Les gens l'ont consulté

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']);
Copier après la connexion

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

curl_setopt($ch, CURLOPT_TIMEOUT,60);
Copier après la connexion

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);//支持毫秒级别超时设置
Copier après la connexion

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.";  
}
Copier après la connexion

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;  
       }
Copier après la connexion

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;   
        }}
Copier après la connexion

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);
Copier après la connexion

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);  
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal