soap — PHP SoapClient: исключение SoapFault Не удалось подключиться к хосту

используя этот код я делаю мыльные запросы

$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

ОБНОВИТЬ

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

13

Решение

Вам нужно еще больше улучшить работу по отладке:

объявление 1) WSDL сильно меняется? Если не, включи WSDL кеширование. Вам не нужно подключаться к серверу, чтобы получить файл WSDL.

Действительно ли упомянутый вами результат создан в echo $e->getMessage();? Вы можете добавить отладочный код внутри catch() блок, например:

  • проверьте, можете ли вы подключиться к серверу другим способом (например, file_get_contents($soap_url))
  • если нет, проверьте, какую ошибку вы получаете
    • распечатайте время и проверьте журналы ошибок на SOAP-сервере
    • 403 Запрещено или похожие точки ошибки на проблеме на сервере
    • Не может подключиться ошибка указывает на проблему в сети (не только, но шансы выше для этого)
  • Вы могли бы попытаться поместить это в цикл (что-то вроде for ($i = 0; $i <= 5; $i++) { /* ... */ sleep(1); continue; }) чтобы узнать, сработает ли вторая попытка

В общем, «иногда ошибки» трудно отлаживать, поэтому либо вы должны попытаться сделать их воспроизводимыми (что укажет на проблему), либо вам необходимо записать и вывести как можно больше данных, чтобы вы могли видеть, где Проблема была в то время, когда это произошло.

7

Другие решения

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

Вы можете увидеть эту ошибку, если вы обновитесь с 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.

17

Вы пытались открыть URL в браузере или через wget или что-то подобное? Затем попробуйте обновить gazillion раз и посмотрите, не возникнут ли ошибки. Я предполагаю, что это проблема сети, но, действительно, из-за шаткой сети очень трудно ее отлаживать …

1

Пожалуйста, проверьте, активен ли keep alive на сервере, и попробуйте изменить его параметры. Это может быть проблема с соединением между получением WSDL и отправкой запроса.

Если файл WSDL не изменяется, вы можете попытаться отключить его и проверить, не возникает ли эта ошибка снова. Просто установите для wsdl значение null и укажите местоположение и адрес URI.

1

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

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);
0
По вопросам рекламы [email protected]