使用 PHP SoapClient 調用 WebService 時,測試環境正常,但正式環境拋出 Could not connect to host 異常。代碼片段如下:
$url = "https://bcsz.xms.foxhis.com:8080/ItfServerWS/XmsWS?wsdl";
$client = new SoapClient($url, array("trace" => true, "connection_timeout" => 100));
$return = $client->getRoomAmount(array('arg0' => $postjson));
telnet bcsz.xms.foxhis.com 8080 或 curl -v https://bcsz.xms.foxhis.com:8080/ItfServerWS/XmsWS?wsdl,確認 TCP 端口可達。對比測試與正式環境域名解析結果:
dig bcsz.xms.foxhis.com
dig xms.foxhis.com
若正式環境域名解析到內網 IP,而 PHP 所在伺服器無路由,需配置 hosts 或調整 DNS。
部分 WebService 的 WSDL 內部 <soap:address location="..."/> 可能指向內網 IP。解決方案:
'location' => 'https://public-ip:8080/...' 覆蓋 WSDL 內部地址。php.ini 中 openssl、soap 擴展已啟用。allow_url_fopen 設置。聯繫正式環境運維確認:WebService 進程是否運行、端口監聽正常、並發連接數未達上限。
啟用 SoapClient 追蹤:
$client = new SoapClient($url, ['trace' => 1, 'exceptions' => 0]);
try {
$result = $client->getRoomAmount(['arg0' => $postjson]);
} catch (SoapFault $f) {
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
var_dump($client->__getLastRequestHeaders());
var_dump($client->__getLastResponseHeaders());
}
通過請求/響應頭定位具體失敗環節。