используя этот код я делаю мыльные запросы
$client = new SoapClient('http://example.com/soap/wsdl');
try {
$result = $client->myMethod();
} catch (Exception $e) {
echo $e->getMessage();
}
Иногда (один раз из десяти) возникает исключение:
Исключение SoapFault: [HTTP] Не удалось подключиться к хосту
Мои попытки
1) Я искал решения, и Я читаю что эта проблема может быть вызвана кешем wsdl, я отключил его в php.ini
:
soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0
вызывает меньше исключений
2) Я попытался добавить к хосту windows (они есть на windows) разрешение днс в windows/system32/drivers/etc/hosts
:
160.XX.XXX.XX example.com
вызывает меньше исключений
3) Я также пытался отключить «Брандмауэр Windows»,
вызывает меньше исключений
4) Я также попытался увеличить default_socket_timeout в php.ini
default_socket_timeout = 90
ничего не изменилось
Вопрос
Серверное мыло, похоже, не имеет проблем. Используется без проблем и с других сайтов. Есть ли что-нибудь еще, что я могу сделать?
Мои настройки
PHP 5.6
Apache 2.4
Windows Server 2012
ОБНОВИТЬ
После многих тестов, я думаю, что проблема в сети, мыльный сервер находится за обратным прокси, проблема появляется в прокси.
Вам нужно еще больше улучшить работу по отладке:
объявление 1) WSDL сильно меняется? Если не, включи WSDL кеширование. Вам не нужно подключаться к серверу, чтобы получить файл WSDL.
Действительно ли упомянутый вами результат создан в echo $e->getMessage();
? Вы можете добавить отладочный код внутри catch()
блок, например:
file_get_contents($soap_url)
)for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }
) чтобы узнать, сработает ли вторая попыткаВ общем, «иногда ошибки» трудно отлаживать, поэтому либо вы должны попытаться сделать их воспроизводимыми (что укажет на проблему), либо вам необходимо записать и вывести как можно больше данных, чтобы вы могли видеть, где Проблема была в то время, когда это произошло.
Я просто собираюсь добавить еще один, возможно, полезный совет к этому шагу. Это то, что вы должны проверить В дополнение к другим полезным ответам, уже написанным здесь.
Вы можете увидеть эту ошибку, если вы обновитесь с PHP 5.5 или старше до PHP 5.6 или PHP7 +. Настройка по умолчанию для soap в более новых версиях PHP заключается в проверке удаленного узла (и так и должно быть). Если вы извлекаете WSDL из HTTPS или у вас есть конечная точка HTTPS, он проверит CA. Если это не удастся, вы получите эту конкретную ошибку.
Есть два способа решить это.
1) Наиболее безопасным вариантом является проверка партнера. В системе Ubuntu вы должны скопировать сертификаты в /usr/local/share/ca-certificates/
и беги update-ca-certificates
как корень.
2) Или вы можете отключить проверку, вот пример того, как это сделать. — Как правило, это не предпочтительный вариант, однако он может обеспечить быстрое решение, если проблема является неотложной. Пожалуйста, не пренебрегайте своей безопасностью.
$soapClient = new SoapClient($wsdl_url, array(
//'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true //can fiddle with this one.
)
))
));
Я считаю, что документация PHP немного фрагментирована, когда дело доходит до SOAP. И особенно SOAP WSSE.
Вы пытались открыть URL в браузере или через wget или что-то подобное? Затем попробуйте обновить gazillion раз и посмотрите, не возникнут ли ошибки. Я предполагаю, что это проблема сети, но, действительно, из-за шаткой сети очень трудно ее отлаживать …
Пожалуйста, проверьте, активен ли keep alive на сервере, и попробуйте изменить его параметры. Это может быть проблема с соединением между получением WSDL и отправкой запроса.
Если файл WSDL не изменяется, вы можете попытаться отключить его и проверить, не возникает ли эта ошибка снова. Просто установите для wsdl значение null и укажите местоположение и адрес URI.
Используйте это, чтобы очистить мыльный кеш в вашем скрипте:
ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);