Есть ли в любом случае для запроса SoapClient тайм–аут и выброс исключения. На данный момент я получаю тайм-аут ответа PHP Server, в моем случае 60 секунд. В основном я хочу, если в течение определенного времени не будет ответа от веб-службы, будет выбрано исключение, и я мог бы его поймать. Предупреждение за 60 секунд – это не то, что я хочу.
Посмотри на
если вам удобно, и ваша среда позволяет вам расширять классы.
Он в основном расширяет класс 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); } } }
В то время как Андрей привязался к достойному решению, у этого есть меньше кода, но он приходит к хорошему решению:
Пример кода:
// // 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) + дает опции для установки количества попыток, соединений и тайм-аутов чтения.