2013-09-25 8 views
4

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

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

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

HTTP/1.1 200 OK
Дата: Ср, 25 сентября 2013 21:00:12 GMT
Сервер: Apache/2.2.15 (CentOS)
X-Powered -By: PHP/5.3.3
Контент-длина: 516
Подключение: закрытие
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. Я в тупике.

+2

Вопросы, касающиеся проблем с кодом Вы написали должны описать конкретную проблему - и включить действительный код для его воспроизведения - в самом вопросе. – Kermit

ответ

6

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

$client = new SoapClient($wsdl,array(
'trace' =>true, 
'connection_timeout' => 500000, 
'cache_wsdl' => WSDL_CACHE_BOTH, 
'keep_alive' => false, 
)); 
+0

Насколько я знаю, это решение работает только для php> = 5.4, так как в более низких версиях параметр keep_alive недоступен. Однако это должно быть availabla в конфигурации вашего веб-сервера – xmoex

+0

Спасибо, тон, после 3 дней поиска это, наконец, решило наши проблемы. – Bas