используя этот код, я делаю запросы на мыло
$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) разрешение dns в 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
ОБНОВИТЬ
После многих тестов я думаю, что проблема в сети, soap-сервер находится за обратным прокси-сервером, проблема возникает в прокси-сервере.
Вам необходимо еще больше улучшить свои усилия по отладке:
ad 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 +. Значение по умолчанию для мыла в новых версиях PHP заключается в проверке удаленного однорангового узла (и так оно и должно быть). Если вы вытаскиваете WSDL из HTTPS или имеете конечную точку HTTPS, он проверяет CA. Если это не удастся, вы получите эту конкретную ошибку.
Это можно решить двумя способами.
1) Наиболее безопасным вариантом является проверка партнера. В системе ubuntu вы должны скопировать сертификаты в /usr/local/share/ca-certificates/
и запустить update-ca-certificates
с правами root.
2) Или вы можете отключить проверку heres примером того, как это сделать. – Обычно это не самый предпочтительный вариант, однако он может обеспечить быстрое исправление, если проблема актуальна. Однако не будьте неряшливы с вашей безопасностью.
$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 раз и посмотрите, не возникли ли какие-либо ошибки. Я предполагаю, что это проблема с сетью, но действительно, увлекательная сеть очень затрудняет отладку …
Проверьте, активен ли активен на сервере и попытайтесь изменить его параметры. Это может быть проблема с соединением между извлечением WSDL и отправкой запроса.
Если файл WSDL никогда не изменяется, вы можете попытаться отключить его и проверить, произошла ли эта ошибка снова. Просто установите wsdl в null и установите местоположение и uri.
Используйте это, чтобы очистить кэш-память в вашем скрипте:
ini_set('soap.wsdl_cache_enabled',0); ini_set('soap.wsdl_cache_ttl',0);