PHP SoapClient: SoapFault exception Could not connect to host

phpsoapsoap-clientsoapserver

using this code I make soap requests

$client = new SoapClient('http://example.com/soap/wsdl');

try {
    $result = $client->myMethod();
} catch (Exception $e) {
    echo $e->getMessage();
}

Sometimes (once out of ten), an exception is raised:

SoapFault exception: [HTTP] Could not connect to host

My attempts

1) I looked for solutions, and I read that this problem can be caused by wsdl cache, I disabled it in php.ini:

soap.wsdl_cache_enabled = 0
soap.wsdl_cache_ttl = 0

raises fewer exceptions

2) I tried to add to the host of windows (they are on windows) the resolution of the dns in windows/system32/drivers/etc/hosts:

160.XX.XXX.XX example.com

raises fewer exceptions

3) I also tried to disable "Windows Firewall",

raises fewer exceptions

4) I also tried to increase the default_socket_timeout in php.ini

default_socket_timeout = 90

nothing has changed

The question

The server soap does not seem to have problems.It is used without problems also from other sites. Is there anything else I can do?

My settings

PHP 5.6

Apache 2.4

Windows Server 2012

UPDATE

After many tests, I think that the problem is in the network, soap server is behind a reverse proxy, the problem appears in the proxy.

Best Solution

Im just going to add one more possibly useful tip to this tread. Its something you should check In addition to the other useful answers already written here.

You might see this error if you upgrade from php 5.5 or older to PHP 5.6 or PHP7+. The default setting for soap in the newer versions of PHP is to verify the remote peer (and so it should be). If you are pulling a WSDL from HTTPS or have an HTTPS endpoint then it will check the CA. If it fails you will get this particular error.

There are two ways to solve this.

1) Most secure option is to verify the peer. On a ubuntu system you would copy the certs to /usr/local/share/ca-certificates/ and run update-ca-certificates as root.

2) Or you can disable the verification heres an example of how to do it. - This is generally not the preferred option, however it could provide a quick fix if the problem is urgent. Please don't be sloppy with your security though.

$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.
        )
    ))
 ));

I find the PHP documentation is a bit fragmented when it comes to SOAP. And especially SOAP WSSE.

Related Question