2016-12-29 453 views
0

我有一個需要連接到SOAP服務器一個PHP客戶端:PHP SOAP客戶端通過IPv4

$client = new \SoapClient('url_to_wsdl.wsdl', [ 
       'local_cert' => 'path_to_certificate.pem', 
       'connection_timeout ' => 300, 
       'trace' => 1, 
      ]); 

$params = []; 
$response = $client->executeAFunction($params); 

但SOAP客戶端無法連接到主機:SoapFault "Could not connect to host"(它實際上無法加載wsdl文件,但我通過使用文件的本地副本嘲笑)。

我發現Soap客戶端無法連接到主機,因爲它默認情況下使用IPv6(我因爲this answer on SO而得到了這一點)。

我有什麼迄今所做的:

  • 我已經在我的服務器(Ubuntu的)上禁用IPv6的,但並沒有改變任何東西 到SOAP客戶端。
  • 通過終端

    $ curl -6 http://v6.testmyipv6.com/ 
    curl: (6) Could not resolve host: v6.testmyipv6.com 
    
    $ curl -4 http://v4.testmyipv6.com/ 
    <html> 
    <head> 
    <title>IPv6 Test and Dual-Stack Test For Network Connectivity</title> 
    ... 
    
    # the above commands are true for all urls I tested 
    

我的實際問題的服務器

  • 我雙重檢查的通過IPv4和IPv6網站的可訪問性是:我怎麼能告訴SOAP客戶端使用連接到主機IPv4而不是使用IPv6?

  • +0

    檢查DNS記錄。如果服務器無法通過IPv6訪問,則不能有任何AAAA記錄。 –

    +0

    @SanderSteffann沒有AAAA記錄,這是問題...該系統能夠到達服務器,但會嘗試看看它在IPv6上造成了「無法連接到主機的過錯。 –

    +0

    只有在已知IPv6地址的情況下,客戶端纔會默認使用IPv6。如果沒有IPv6地址,則客戶端會回退到IPv4,除非您以某種其他方式強制使用特定的協議(就像您使用curl所做的那樣)。你必須有一個不同的問題。 –

    回答

    0

    的SOAP請求是一個套接字連接,所以你可以使用socket_context選項。 使用stream_context_create()結合您的要求到指定的IP。

    stream_context_create(['socket' => ['bindto' => '123.123.123.123:0']]); 
    

    設置0爲端口號,所以PHP會自動設置它。