次のような場所に WSDL があります。
https://provider.web-service.domain/path/ServiceName?wsdl
次のような行があります。
<wsdl:import namespace="http://name/space/service/" location="ServiceName.wsdl"></wsdl:import>
すなわち。次の場所で別の wsdl をインポートしようとしています:
https://provider.web-service.domain/path/ServiceName.wsdl
したがって、SoapClient を初期化するときに、次のエラーが発生します。
PHP Fatal error: SOAP-ERROR: Parsing WSDL:
Couldn't load from 'https://provider.web-service.domain/path/ServiceName.wsdl' :
failed to load external entity "https://provider.web-service.domain/path/ServiceName.wsdl"
現在、WSDL プロバイダーでこの問題を解決しようとしていますが、この問題の回避策はありますか?
唯一の解決策は、アクセス可能なリソースを実際に指すパスを提供することだと思います。そして、実際には、それについて私ができることはあまりありません。
あなたの考え。
関連している:
アップデート
プロバイダーは、PHP SOAP クライアント SUX (本質的に) と言っています。
変更されたタイトル:
- php SoapClient: 外部エンティティから読み込めませんでした。に
- php SoapClient: 外部エンティティから読み込めませんでした (エンドポイントが別の場所に解決される場合)
そのため、PHP SoapClient は、wsdl への URL が別の場所に解決されていることを認識しないため、元の場所からファイルをインポートしようとします。
リソースは元の場所に存在しないため、エラーがスローされます。
回避策として、サーバーに配置できるように WSDL が提供されています。
しかし、この問題にはより良い解決策が必要です。
更新 2
明確にするために、質問を言い換えたいと思います。
次の WSDL URL を使用するように依頼されました。
[1] https://provider.web-service.domain/path/ServiceName?wsdl
次の場所に 2 つの WSDL があります。
[2] https://provider.web-service.domain/path/ServiceName/another/diff/path/prefix_ServiceName.wsdl
[3] https://provider.web-service.domain/path/ServiceName/another/diff/path/ServiceName.wsdl
- [1] は [2] に解決されます。それで
- [2]輸入[3]
[1] を SoapClient() に渡すと、FATAL になります (前述のとおり)。
[2] を SoapClient() に渡すと動作します。