Время ожидания SoapClient PHP

Есть ли в любом случае для запроса SoapClient таймаут и выброс исключения. На данный момент я получаю тайм-аут ответа PHP Server, в моем случае 60 секунд. В основном я хочу, если в течение определенного времени не будет ответа от веб-службы, будет выбрано исключение, и я мог бы его поймать. Предупреждение за 60 секунд – это не то, что я хочу.

Посмотри на

  • Вызов PHP Мыльные призы от Роберта; 21 октября 2009 г.

если вам удобно, и ваша среда позволяет вам расширять классы.

Он в основном расширяет класс SoapClient , заменяет HTTP-транспорт завихрением, который может обрабатывать таймауты:

 class SoapClientTimeout extends SoapClient { private $timeout; public function __setTimeout($timeout) { if (!is_int($timeout) && !is_null($timeout)) { throw new Exception("Invalid timeout value"); } $this->timeout = $timeout; } public function __doRequest($request, $location, $action, $version, $one_way = FALSE) { if (!$this->timeout) { // Call via parent because we require no timeout $response = parent::__doRequest($request, $location, $action, $version, $one_way); } else { // Call via Curl and use the timeout $curl = curl_init($location); curl_setopt($curl, CURLOPT_VERBOSE, FALSE); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_POST, TRUE); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); curl_setopt($curl, CURLOPT_HEADER, FALSE); curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml")); curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout); $response = curl_exec($curl); if (curl_errno($curl)) { throw new Exception(curl_error($curl)); } curl_close($curl); } // Return? if (!$one_way) { return ($response); } } } 

В то время как Андрей привязался к достойному решению, у этого есть меньше кода, но он приходит к хорошему решению:

  • Обработка тайм-аутов с расширением SoapClient PHP5 (Антонио Рамирес, 02 февраля 2010 г.)

Пример кода:

 // // setting a connection timeout (fifteen seconds on the example) // $client = new SoapClient($wsdl, array("connection_timeout" => 15)); 

И есть также контекст потока, если вам нужен более тонкий HTTP-контроль. См. stream_context для new SoapClient() . Под поверхностью SoapClient используется протокол HTTP и SSL.

 ini_set("default_socket_timeout", 15); $client = new SoapClient($wsdl, array(......)); 

Параметр connection_timeout определяет тайм-аут в секундах для подключения к службе SOAP. Этот параметр не определяет тайм-аут для служб с медленными ответами. Чтобы ограничить время ожидания вызовов, чтобы завершить настройку default_socket_timeout, доступно.

Принятый ответ нарушит все функциональные возможности, которые предлагает SoapClient. Подобно настройке правильных заголовков содержимого, аутентификации и т. Д.

Это было бы лучшим решением проблемы

 class MySoapClient extends \SoapClient { private $timeout = 10; public function __construct($wsdl, array $options) { // Defines a timeout in seconds for the connection to the SOAP service. // This option does not define a timeout for services with slow responses. // To limit the time to wait for calls to finish the default_socket_timeout setting is available. if (!isset($options['connection_timeout'])) { $options['connection_timeout'] = $this->timeout; } parent::__construct($wsdl, $options); } public function setTimeout($timeout) { $this->timeout = $timeout; } public function __doRequest($request, $location, $action, $version, $one_way = 0) { $original = ini_get('default_socket_timeout'); ini_set('default_socket_timeout', $this->timeout); $response = parent::__doRequest($request, $location, $action, $version, $one_way); ini_set('default_socket_timeout', $original); return $response; } } 

Вы можете установить это через композитор: https://github.com/ideaconnect/idct-soap-client . Он работает как обычный SoapClient (deriative) + дает опции для установки количества попыток, соединений и тайм-аутов чтения.