Я получаю следующее исключение на моей 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
Один из моих процессов в веб-сервисе занимал много времени. Поэтому я получал выпадение мыльных пузырей.