Я получаю следующее исключение на моей php-странице.
Исключение SoapFault: [HTTP] Ошибка Получение заголовков HTTP
Я прочитал пару статей и обнаружил, что default_socket_timeout нуждается в настройке. поэтому я установил его следующим образом. default_socket_timeout = 480
Я все еще получаю такую же ошибку. Кто-нибудь может мне помочь?
Я получаю Error fetching http headers
получая Error fetching http headers
по двум причинам:
Keep-Alive
(на которые распространяется мой ответ). PHP всегда будет пытаться использовать постоянное соединение с веб-службой, отправив HTTP-заголовок Connection: Keep-Alive
. Если сервер всегда закрывает соединение и не сделал этого (PHP не получил EOF
), вы можете получить сообщение об Error fetching http headers
когда PHP пытается повторно использовать соединение, которое уже закрыто на стороне сервера.
Примечание: этот сценарий произойдет только в том случае, если один и тот же объект SoapClient
отправляет более одного запроса и с высокой частотой. Отправка Connection: close
HTTP-заголовок вместе с первым запросом, это было бы исправлено.
В PHP версии 5.3.5 (в настоящее время поставляется с Ubuntu) настройка HTTP-заголовка Connection: Close
не поддерживается SoapClient. Нужно иметь возможность отправлять HTTP-заголовок в контексте потока (используя $option
– key stream_context
как аргумент SoapClient
), но SoapClient
не поддерживает изменение заголовка Connection ( Update: эта ошибка была решена в PHP версии 5.3.11 ).
Другое решение – реализовать свой собственный __doRequest()
. В приведенной ссылке парень использует Curl
для отправки запроса. Это сделает ваше приложение PHP зависимым от Curl
. В реализации также отсутствуют такие функции, как сохранение заголовков запросов / ответов.
Третьим решением является просто закрыть соединение сразу после получения ответа. Это можно сделать, установив атрибут httpsocket
в NULL
в __doRequest()
, __call()
или __soapCall()
. Пример с __call()
:
class MySoapClient extends SoapClient { function __call ($function_name , $arguments) { $response = parent::__call ($function_name , $arguments); $this->httpsocket = NULL; return $response; } }
У меня была такая же проблема, и я попробовал следующее, отключив keep_alive
.
$api_proxy = new SoapClient($api_url, array('trace' => true, 'keep_alive' => false));
Однако это не сработало для меня. То, что работало для меня, было отключением кэша SOAP. Похоже, что кеширование неверных запросов и после отключения я фактически заметил, что мои запросы выполнялись быстрее.
На сервере linux вы можете найти это в файле /etc/php.ini
.
Найдите soap.wsdl_cache_enabled=1
и измените его на soap.wsdl_cache_enabled=0
.
Не забудьте перезагрузить apache. service httpd reload
Один из моих процессов в веб-сервисе занимал много времени. Поэтому я получал выпадение мыльных пузырей.