Maison  >  Article  >  développement back-end  >  Comment résoudre le problème du délai d'expiration du service de demande Curl et Soap en PHP

Comment résoudre le problème du délai d'expiration du service de demande Curl et Soap en PHP

不言
不言original
2018-06-11 14:00:272342parcourir

Cet article présente principalement la solution au problème du délai d'attente du service de demande curl et soap en PHP. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

De nombreux services de l'entreprise utilisent curl ou soap pour se connecter à des services fournis par des sociétés tierces afin d'échanger des données. Récemment, une nouvelle exigence a été ajoutée, c'est-à-dire que lorsque le service tiers est publié, il ne peut pas se connecter au serveur de l'autre partie. Une nouvelle tentative est nécessaire. Si le traitement commercial échoue pour d'autres raisons, il sera traité comme un échec et ne sera pas rappelé.

L'idée est de juger que lorsque curl ou soap ne peuvent pas se connecter au serveur de l'autre partie, une exception TimeoutException sera levée et une nouvelle tentative sera effectuée après l'avoir détectée. être traité comme un échec.

traitement des boucles

  $ch = curl_init($url);
    $options = array(
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_CONNECTTIMEOUT => 5, //5秒连接时间
      CURLOPT_TIMEOUT    => 30, //30秒请求等待时间
    );
    
    curl_setopt_array($ch, $options);
    $response = curl_exec($ch);
    if ($no = curl_errno($ch)) {
      $error = curl_error($ch);
      curl_close($ch);
      //$no错误码7为连接不上,28为连接上了但请求返回结果超时
      if(in_array(intval($no), [7, 28], true)) {
        throw new TimeoutException('连接或请求超时' . $error, $no);
      }
    }
    curl_close($ch);

traitement du savon

Le document PHP n'écrit pas sur le délai d'expiration du savon ou connexion en détail Sans le code spécifique renvoyé, tout échec tel qu'un échec de traitement commercial ou un échec de connexion lèvera une exception SoapFault. Après avoir examiné le code source de php, j'ai trouvé qu'il existe toujours une source

php définie. emplacement du fichier/ext /soap/php_http.c

Définir le contenu du code d'erreur

add_soap_fault(this_ptr, "HTTP", "Impossible d'analyser l'URL", NULL, NULL) ;
add_soap_fault(this_ptr, "HTTP", "Protocole inconnu. Seuls http et https sont autorisés.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Le support SSL n'est pas disponible dans cette version ", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Impossible de se connecter à l'hôte", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Échec de l'envoi HTTP Requête SOAP", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Échec de la création du flux ??", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Erreur lors de la récupération des en-têtes http ", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Erreur lors de la récupération du corps http, aucune longueur de contenu, connexion fermée ou données fragmentées", NULL, NULL);
add_soap_fault(this_ptr, "HTTP ", "Limite de redirection atteinte, abandon", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Je n'ai pas reçu de document XML", NULL, err);
add_soap_fault(this_ptr, "HTTP ", "Codage de contenu inconnu", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Impossible de décompresser la réponse compressée", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", http_msg, NULL, NULL);

Comme vous pouvez le voir dans le code, si la connexion échoue, un code HTTP sera renvoyé n'ayant pas de code spécifique comme curl à distinguer. entre les deux. Utilisez uniquement ce code. On peut juger qu'il s'agit d'un problème de réseau tel qu'un délai d'attente ou un échec de connexion

Le code spécifique est le suivant

ini_set('default_socket_timeout', 30); //定义响应超时为30秒

    try {
      $options = array(
        'cache_wsdl' => 0,
        'connection_timeout' => 5, //定义连接超时为5秒
      );
      libxml_disable_entity_loader(false);
      $client = new \SoapClient($url, $options);
      return $client->__soapCall($function_name, $arguments);

    } catch (\SoapFault $e) {
      //超时、连接不上
      if($e->faultcode == 'HTTP'){
        throw new TimeoutException('连接或请求超时', $e->getCode());
      }
    }


Vous pouvez vous connecter au service Soap, mais le client Ou il y a un problème sur le serveur. $e->faultcode renverra WSDL Utilisez ceci pour juger

Ce qui précède. C'est tout le contenu de cet article.J'espère qu'il sera utile à l'apprentissage de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Comment stocker des tableaux PHP dans la base de données

Méthodes d'implémentation de trois fonctions récursives PHP Et réaliser l'accumulation de chiffres

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