Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem der Zeitüberschreitung des Curl- und Soap-Anforderungsdienstes in PHP

So lösen Sie das Problem der Zeitüberschreitung des Curl- und Soap-Anforderungsdienstes in PHP

不言
不言Original
2018-06-11 14:00:272326Durchsuche

Dieser Artikel stellt hauptsächlich die Lösung des Problems des Curl- und Soap-Request-Service-Timeouts in PHP vor. Der Inhalt ist jetzt ziemlich gut und dient als Referenz.

Viele Dienste im Unternehmen verwenden Curl oder Soap, um eine Verbindung zu Diensten von Drittanbietern herzustellen und Daten auszutauschen. Kürzlich wurde eine neue Anforderung hinzugefügt, nämlich wenn der Drittanbieterdienst freigegeben wird. Es kann keine Verbindung zum Server der anderen Partei hergestellt werden. Wenn die Geschäftsverarbeitung aus anderen Gründen fehlschlägt, wird dies als Fehler behandelt und nicht erneut aufgerufen.

Die Idee besteht darin, zu beurteilen, dass eine TimeoutException-Ausnahme ausgelöst wird, wenn Curl oder Soap keine Verbindung zum Server der anderen Partei herstellen können, und dass ein erneuter Versuch durchgeführt wird, nachdem die Ausnahme aufgrund anderer Fehler abgefangen wurde als Misserfolge behandelt werden.

Curl-Verarbeitung

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

Seifenverarbeitung

Das PHP-Dokument schreibt nicht im Detail über Soap-Timeout oder Fehler beim Herstellen einer Verbindung Der zurückgegebene spezifische Code löst eine SoapFault-Ausnahme aus, wenn die Geschäftsverarbeitung fehlschlägt oder die Verbindung fehlschlägt. Nachdem ich mir den Quellcode von PHP angesehen habe, habe ich festgestellt, dass es immer noch einen definierten

Speicherort der PHP-Quelldatei gibt. ext/soap /php_http.c

Fehlercodeinhalt definieren

add_soap_fault(this_ptr, "HTTP", "URL kann nicht analysiert werden", NULL, NULL );
add_soap_fault(this_ptr, "HTTP", "Unbekanntes Protokoll. Nur http und https sind zulässig.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "SSL-Unterstützung ist hier nicht verfügbar build", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Verbindung zum Host konnte nicht hergestellt werden", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Senden der HTTP-SOAP-Anfrage fehlgeschlagen" , NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Fehler beim Erstellen des Streams??", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Fehler beim Abrufen von HTTP-Headern", NULL , NULL) ;
add_soap_fault(this_ptr, "HTTP", "Fehler beim Abrufen des HTTP-Textes, keine Inhaltslänge, Verbindung geschlossen oder aufgeteilte Daten", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", " Umleitungslimit erreicht, Abbruch", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Kein XML-Dokument empfangen", NULL, err);
add_soap_fault(this_ptr, "HTTP", " Unbekannte Inhaltskodierung", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "Komprimierte Antwort kann nicht dekomprimiert werden", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", http_msg, NULL , NULL) ;

Wie Sie dem Code entnehmen können, wird ein HTTP-Code zurückgegeben, wenn die Verbindung fehlschlägt. Soap hat keinen spezifischen Code wie Curl, um zwischen den beiden zu unterscheiden . Sie können diesen Code nur verwenden, um festzustellen, ob es sich um ein Netzwerkproblem wie eine Zeitüberschreitung oder einen Verbindungsfehler handelt

Der spezifische Code lautet wie folgt

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


Sie können eine Verbindung zum Soap-Dienst herstellen, aber der Client oder Server schlägt WSDL zurück. Verwenden Sie dies zur Beurteilung

Das Obige ist der gesamte Inhalt dieses Artikels Ich hoffe, es wird für das Lernen aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

So speichern Sie PHP-Arrays in der Datenbank

Implementierungsmethoden für drei rekursive PHP-Funktionen Und realisieren die Anhäufung von Zahlen

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Zeitüberschreitung des Curl- und Soap-Anforderungsdienstes in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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