Подтвердить что ты не робот

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) Я попытался добавить в хост окон (они находятся на окнах) разрешение 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

UPDATE

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Эта ошибка может возникнуть при обновлении с 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.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

ini_set('soap.wsdl_cache_enabled',0);
ini_set('soap.wsdl_cache_ttl',0);