Исключение SoapFault: [HTTP] Ошибка Получение заголовков HTTP

Я получаю следующее исключение на моей php-странице.

Исключение SoapFault: [HTTP] Ошибка Получение заголовков http

Я прочитал пару статей и обнаружил, что default_socket_timeout нуждается в настройке. поэтому я установил его следующим образом. default_socket_timeout = 480

Я все еще получаю такую ​​же ошибку. Может кто-нибудь помочь мне?

Ответы

Ответ 1

Один из моих процессов в веб-сервисе занимал много времени. Поэтому я получал выпадение мыльных пузырей.

Ответ 2

Я получаю Error fetching http headers по двум причинам:

  • Сервер занимает много времени, чтобы ответить.
  • Сервер не поддерживает подключения Keep-Alive (на который распространяется мой ответ).

PHP всегда будет пытаться использовать постоянное соединение с веб-службой, отправив заголовок Connection: Keep-Alive HTTP. Если сервер всегда закрывает соединение и не сделал этого (PHP не получил EOF), вы можете получить Error fetching http headers, когда PHP попытается повторно использовать соединение, которое уже закрыто на стороне сервера.

Примечание. этот сценарий произойдет только в том случае, если один и тот же объект SoapClient отправляет более одного запроса и с высокой частотой. Отправка Connection: close HTTP-заголовка вместе с первым запросом исправила бы это.

В PHP версии 5.3.5 (в настоящее время поставляемой с Ubuntu) настройка HTTP-заголовка Connection: close не поддерживается SoapClient. Нужно иметь возможность отправлять HTTP-заголовок в контексте потока (используя $option - ключ stream_context как аргумент SoapClient), но SoapClient не поддерживает изменение заголовка соединения ( Обновление:. Эта ошибка была решена в PHP версии 5.3.11).

Другим решением является реализовать собственный __doRequest(). В приведенной ссылке парень использует Curl для отправки запроса. Это сделает ваше приложение PHP зависимым от Curl. В реализации также отсутствуют такие функции, как сохранение заголовков запросов/ответов.

Третье решение - просто закрыть соединение сразу после получения ответа. Это можно сделать, установив атрибут SoapClients 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;
    }
}

Ответ 3

У меня была такая же проблема, и я попробовал следующее, отключив 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