wsdlモードで実行されているSoapClientは、OSプロキシの除外を尊重せず、それらを直接追加するためのフラグを持っていないようです。
これは、スキーマ定義が内部定義スキーマと外部定義スキーマの両方を参照する場合に問題を引き起こします。テストのために、最初のwsdlドキュメントをローカルにプルしました。スキーマがw3.orgおよびその他のインターネットベースのスキーマ定義を参照するため、プロキシを有効にしました。問題は、ローカルドキュメントがまだプロキシの内部と外部の両方のリソースを参照しており、プロキシを有効にすると、すべてのリクエストをプロキシ経由で送信したいということです。
私は次のコードを持っています:
$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ルールを尊重させる方法はありますか?