Maison >développement back-end >Problème PHP >Comment résoudre le délai d'expiration de l'interface de requête PHP

Comment résoudre le délai d'expiration de l'interface de requête PHP

王林
王林original
2019-09-29 17:48:066288parcourir

Comment résoudre le délai d'expiration de l'interface de requête PHP

[Accès HTTP]

Généralement, nous accédons à HTTP de plusieurs manières, principalement : curl, socket, file_get_contents() et d'autres méthodes.

Si le serveur de l'autre partie ne répond jamais, nous serons dans une tragédie. Il est facile de tuer tout le serveur, nous devons donc également prendre en compte le problème du délai d'attente lors de l'accès à http.

[Accès CURL HTTP]

CURL est une bibliothèque lib couramment utilisée et fiable pour accéder à l'interface du protocole HTTP, avec des performances élevées et certaines fonctions de concurrence, etc.

CURL :

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

CURLOPT_TIMEOUT Set le nombre maximum de secondes pendant lesquelles cURL est autorisé à s'exécuter.

CURLOPT_TIMEOUT_MS définit le nombre maximum de millisecondes pendant lesquelles 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 infiniment.

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 à partir de PHP 5.2.3.

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

délai d'expiration 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); //Il vous suffit de définir le nombre de secondes

curl_setopt( $ ch, CURLOPT_HTTPHEADER, $headers);

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

curl utilisation normale du délai d'attente de deuxième niveau :

curl_setopt($ch, CURLOPT_TIMEOUT, 60);

Si un délai d'attente d'une milliseconde est requis pour curl, vous devez ajouter :

curl_easy_setopt( curl, CURLOPT_NOSIGNAL, 1L ; Un exemple de curl avec un timeout d'une milliseconde :

<?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.";
}
?>
Quelques autres conseils :

Selon l'expérience, le résumé est. : cURL version >= libcurl/7.21. Dans la version 0, le délai d'attente en millisecondes prendra définitivement effet, rappelez-vous.

2. Il y a aussi un problème avec le délai d'attente en millisecondes de curl_multi. . Un seul accès prend en charge le délai d'expiration au niveau MS, et curl_multi sera inexact si plusieurs appels sont effectués en parallèle

[Accès HTTP via le traitement de flux]

En plus de curl , nous le faisons souvent aussi nous-mêmes. Utilisez fsockopen ou la fonction d'opération de fichier pour traiter le protocole HTTP, donc notre traitement du délai d'attente pour cela est également nécessaire.

Tutoriel recommandé :

Tutoriel vidéo PHP

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