Исключение SoapFault: [HTTP] Ошибка при получении заголовков http - PullRequest
14 голосов
/ 28 января 2011

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 23 сентября 2011

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

  1. Для ответа сервера требуется много времени.
  2. Сервер не поддерживает 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 - ключ 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;
    }
}
1 голос
/ 16 декабря 2016

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

0 голосов
/ 28 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...