これは私のWAMPサーバーでは正常に動作しますが、Linuxマスターサーバーでは動作しません!?
try{
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
$result = $client->checkVat([
'countryCode' => 'DK',
'vatNumber' => '47458714'
]);
print_r($result);
}
catch(Exception $e){
echo $e->getMessage();
}
ここに何が欠けていますか?! :(
SOAPが有効になっています
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"
PHPからURLを呼び出すとエラーが返されます
$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;
Warning: file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable
LinuxコマンドラインHTTP 200
からURLを呼び出すと、XML応答が返されます
curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
Phpの一部のバージョンでは、SoapClientはhttpユーザーエージェント情報を送信しません。サーバーにあるphpバージョンとローカルWAMPのバージョンは何ですか?
次のようにコンテキストストリームを使用して、ユーザーエージェントを明示的に設定してください。
try {
$opts = array(
'http' => array(
'user_agent' => 'PHPSoapClient'
)
);
$context = stream_context_create($opts);
$wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
$soapClientOptions = array(
'stream_context' => $context,
'cache_wsdl' => WSDL_CACHE_NONE
);
$client = new SoapClient($wsdlUrl, $soapClientOptions);
$checkVatParameters = array(
'countryCode' => 'DK',
'vatNumber' => '47458714'
);
$result = $client->checkVat($checkVatParameters);
print_r($result);
}
catch(Exception $e) {
echo $e->getMessage();
}
実際には、使用しているWebサービスに問題があるようです。 HTTP over IPv6とHTTPユーザーエージェント文字列の欠落の組み合わせにより、Webサービスの問題が発生しているようです。
これを確認するには、Linuxホストで次を試してください。
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
このIPv6要求は失敗します。
curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
このIPv6要求は成功します。
curl -A '' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl -A 'cURL User Agent' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
これらのIPv4要求は両方とも成功します。
おもしろいケース:) linuxホストはec.europa.euをIPv6アドレスに解決し、SoapClientのバージョンはデフォルトでユーザーエージェント文字列を追加しなかったと思います。
これを試して。私はそれが役立つことを願っています
$options = array(
'cache_wsdl' => 0,
'trace' => 1,
'stream_context' => stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
))
$client = new SoapClient(url, $options);
この問題は、libxmlエンティティローダーが無効になっていることが原因である可能性があります。
SoapClient
をインスタンス化する前に、libxml_disable_entity_loader(false);
を実行してみてください。
変更してみてください
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
に
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);
また(動作するかどうかに関係なく)、/tmp
がWebサーバーによって書き込み可能であり、満杯でないことを確認してください。
この質問に対する正確な答えはありませんが、誰かにとって役立つかもしれません。
私の石鹸のURLには非標準のポート(たとえば9087)があり、ファイアウォールはその要求をブロックしており、このエラーが発生するたびにエラーが発生しました。
エラー-2017-12-19 20:44:11->致命的なエラー-SOAPエラー:WSDLの解析: ' http://soalurl.test:9087/orawsv?wsdl からロードできませんでした= ':外部エンティティの読み込みに失敗しました " http://soalurl.test:9087/orawsv?wsdl "
ファイアウォールでポートを許可し、エラーを解決しました!
503は、機能が機能していることを意味し、リモートサーバーから応答があり、拒否されています。 googleの結果をcURLにしようとした場合、file_get_contentsとcURLで使用されるユーザーエージェントを検出し、結果としてそれらのユーザーエージェントをブロックできるため、同じことが起こります。また、アクセス元のサーバーのIPアドレスがそのようなプラクティスのためにブラックボール化されている可能性もあります。
主に、リモートの状況でブラウザーのようにコマンドが機能しない3つの一般的な理由。
1)デフォルトのUSER-AGENTはブロックされています。 2)サーバーのIPブロックがブロックされています。 3)リモートホストにはプロキシ検出があります。
Php.iniでopenssl拡張機能が無効になっている場合は、有効にしてみてください。このようにして、追加の引数を必要とせずにWebサービスにアクセスできました。
$client = new SoapClient(url);
AdWords APIを使用していますが、同じ問題が発生する場合があります。私の解決策は、ini_set( 'default_socket_timeout'、900);を追加することです。ファイルvendor\googleads\googleads-php-lib\src\Google\AdsApi\AdsSoapClient.phpの65行目
およびvendor\googleads-php-lib\src\Google\AdsApi\Adwords\Reporting\v201702\ReportDownloader.phpの行126 ini_set( 'default_socket_timeout'、900); $ requestOptions ['stream_context'] ['http'] ['timeout'] = "900";
Googleパッケージは、デフォルトのphp.iniパラメーターを上書きします。
ページが「 https://adwords.google.com/ap i/adwords/mcm/v201702/ManagedCustomerService?wsdl」に接続することもあれば、接続しないこともあります。ページが1回接続すると、WSDLキャッシュに同じページが含まれ、コードがキャッシュを更新するまでプログラムは問題ありません...