>  기사  >  백엔드 개발  >  PHP에서 컬 및 비누 요청 서비스 시간 초과 문제를 해결하는 방법

PHP에서 컬 및 비누 요청 서비스 시간 초과 문제를 해결하는 방법

不言
不言원래의
2018-06-11 14:00:272346검색

이 글은 주로 PHP에서 발생하는 컬 및 비누 요청 서비스 시간 초과 문제에 대한 해결 방법을 소개합니다. 내용이 꽤 좋아서 참고용으로 알려드리겠습니다.

회사의 많은 서비스는 컬이나 비누를 사용하여 타사에서 제공하는 서비스에 연결하여 데이터를 교환합니다. 최근에는 타사 서비스가 출시되면 다시 시도해야 한다는 새로운 요구 사항이 추가되었습니다. 상대방 서버에 연결할 수 없는 경우, 기타 사유로 인해 업무 처리가 실패한 경우에는 실패로 처리되어 다시 호출되지 않습니다.

컬이나 비누가 상대방 서버에 연결할 수 없을 때 TimeoutException 예외가 발생하고, 이를 포착한 후 다시 시도한다고 판단하여 다른 오류로 인해 발생하는 예외는 실패로 처리한다는 개념입니다.

curlprocessing

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

soapprocessing

php 문서에서는 비누 시간 초과 또는 연결 실패로 인해 반환된 특정 코드를 자세히 설명하지 않습니다. SoapFault 예외가 발생합니다. PHP의 소스 코드를 살펴보니 여전히 정의되어 있는 것을 발견했습니다

php 소스 파일 위치/ext/soap/php_http.c

오류 코드 내용 정의

add_soap_fault(this_ptr, "HTTP", " URL을 구문 분석할 수 없습니다.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "알 수 없는 프로토콜입니다. http 및 https만 허용됩니다.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "SSL 지원 이 빌드에서는 사용할 수 없습니다.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "호스트에 연결할 수 없습니다.", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "HTTP SOAP 요청 전송 실패 ", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "스트림을 생성하지 못했습니다??", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "http 헤더를 가져오는 중 오류 발생", NULL, NULL) ;
add_soap_fault(this_ptr, "HTTP", "http 본문 가져오기 오류, 콘텐츠 길이 없음, 연결이 닫혔거나 청크된 데이터", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "리디렉션 제한에 도달했습니다. 중단 중", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "xml 문서를 받지 못했습니다.", NULL, err);
add_soap_fault(this_ptr, "HTTP", "알 수 없는 콘텐츠 인코딩", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", "압축된 응답을 압축 해제할 수 없음", NULL, NULL);
add_soap_fault(this_ptr, "HTTP", http_msg, NULL, NULL);

코드에서 확인할 수 있습니다. 연결이 HTTP 코드를 반환할 수 없다는 것과 달리 비누에는 둘을 구별하는 특정 코드가 없습니다. 이 코드를 사용하여 시간 초과인지 연결 실패인지 및 기타 네트워크 문제인지 확인할 수 있습니다. 는 다음과 같습니다

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

비누 서비스에 연결했지만 클라이언트 또는 서버에 문제가 있습니다. $e->faultcode는 WSDL을 반환합니다. 위 내용은 이 문서의 전체 내용입니다. . 모든 분들의 학습에 도움이 되기를 바랍니다. 더 많은 관련 내용을 보시려면 PHP 중국어 웹사이트를 팔로우해주세요!

관련 권장 사항:

PHP 배열을 데이터베이스에 저장하는 방법

세 가지 PHP 재귀 함수를 구현하고 숫자 누적을 구현하는 방법

위 내용은 PHP에서 컬 및 비누 요청 서비스 시간 초과 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.