Ошибка мыла php при получении заголовков http

Я работаю над скриптом PHP, который обрабатывает много данных через соединение SOAP. По оценкам, общее время выполнения скрипта составляет несколько дней, если он не обнаружит каких-либо ошибок. Проблема, с которой я сталкиваюсь, заключается в том, что скрипт будет работать какое-то время, от часа до дня, а затем соединение SOAP прервется с ошибкой "error fetching http headers".

Я видел много статей, предлагающих увеличить параметр default_socket_timeout, и я попробовал это. Это не помогло. Я знаю, что это работает, потому что он делает по крайней мере сотню успешных вызовов, прежде чем потерпит неудачу. Могу ли я что-нибудь сделать, чтобы остановить эту ошибку?

Обновление
Я распечатал заголовки запроса и ответа в надежде увидеть там ошибку. Но, кажется, они в порядке:

HTTP/1.1 200 OK
Дата: среда, 25 сентября 2013 г., 21:00:12 по Гринвичу
Сервер: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
> Content-Length: 516
Connection: close
Content-Type: text/xml; кодировка = UTF-8

что касается примера кода, то реальный скрипт безумно длинный, но основная предпосылка такова:

ini_set('default_socket_timeout', 120);
$client = new SoapClient($wsdl,array(
    'trace' =>true,
    'connection_timeout' => 500000,
    'cache_wsdl' => WSDL_CACHE_BOTH,
    'keep_alive' => true,
));
while(!$finished) {
    $finished = $client->someSoapFunction($data);
}

someSoapFunction() вернет действительные данные для 100 подключений, а затем случайным образом вернет мне указанную выше ошибку. Время, в течение которого он работает, меньше любого из установленных тайм-аутов. Я не получаю ошибок в журналах ошибок php или apache. Я в тупике.


person Jason Neumann    schedule 25.09.2013    source источник
comment
Вопросы, касающиеся проблем с написанным вами кодом, должны описывать конкретную проблему — и включать действительный код для ее воспроизведения — в самом вопросе.   -  person Kermit    schedule 25.09.2013


Ответы (1)


Я знаю, что это старый вопрос, но, возможно, мое решение может быть полезно другим. У меня была та же проблема, и, изменив параметр keep_alive на false при создании объекта SoapClient, моя проблема была решена:

$client = new SoapClient($wsdl,array(
'trace' =>true,
'connection_timeout' => 500000,
'cache_wsdl' => WSDL_CACHE_BOTH,
'keep_alive' => false,
));
person user3240252    schedule 27.01.2014
comment
насколько я знаю, это решение работает только для php ›= 5.4, так как в более ранних версиях опция keep_alive недоступна. Однако он должен быть доступен в конфигурации вашего веб-сервера. - person xmoex; 29.01.2014
comment
Большое спасибо, после 3 дней поиска это, наконец, решило наши проблемы. - person Bas; 22.05.2015