以 wsdl 模式运行的 SoapClient 不支持 OS 代理排除,并且似乎没有直接添加它们的标志。
当模式定义同时引用内部和外部定义的模式时,这会造成困难。对于测试,我已将初始 wsdl 文档拉到本地。我已启用代理,因为架构引用 w3.org 和其他一些基于 Internet 的架构定义。问题是本地文档仍然引用代理内部和外部的资源,一旦我启用代理,它希望通过它发送每个请求。
我有以下代码:
$client = new SoapClient('SomeResource.wsdl',array(
'proxy_host'=>'10.0.0.1',
'proxy_port'=>8080,
'soap_version'=>SOAP_1_1,
'exceptions'=>true,
'trace'=>1,
'cache_wsdl'=>WSDL_CACHE_NONE,
'login'=>'username',
'password'=>'password'
));
运行 strace:
stat("http://localresource.localdomain.com:1080/some/version/Common.xsd", 0x7fffd94a36d0) = -1 ENOENT (No such file or directory)
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 7
fcntl(7, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(7, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(7, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("10.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
... timeout here cause it's a local resource ...
我当然更改了名称以保护我的客户,但我的 no_proxy 列表中确实有 localdomain.com:
somehost:someuser> env |grep proxy
http_proxy=http://10.0.0.1:8080
ftp_proxy=http://10.0.0.1:8080
https_proxy=http://10.0.0.1:8080
no_proxy=localdomain.com,localhost,127.0.0.1
向 SoapClient 输入添加 no_proxy 无效。
没有提取所有内部架构并修改所有这些引用以也指向本地定义的资源,有没有办法让 SoapClient 遵守 no_proxy 规则?