URLのチェックが有効であること(PHP SOAPクライアントから)
-
05-07-2019 - |
質問
ユーザーがSoapClientのURLを指定できるWebアプリを作成しています。ユーザーがフォームを送信したときにphpがクライアントに接続できることを検証したかったのです。 try catchまたはset_error_handler(またはこの2つの組み合わせ)を使用してこれを実行できます。ただし、致命的なエラーの場合、これは不可能なようです。回復不能なエラーをスローしないURLをSoapClentでテストする方法はありますか?
Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'
URLが存在しないためエラーにフラグを付けたいが、キャッチできるようにしたい。
それ以外の場合は、自分でURLをダウンロードして検証しようとすることができると思いますが、SoapClientからURLを実行できると考えていました。
これは致命的なエラーですか?
編集
rogeriopvlの答えを読んだ後、soapclientコンストラクターと(必死に)use-soap-error-handler関数の「例外」オプションを試したことを言ったはずだと再確認します。
解決
xdebugを使用していますか? このPHPバグレポートとディスカッションによると、この問題は少なくともPHP 5.1、ただしこのxdebugのバグは、「致命的なエラーから例外への変換」で混乱しています例外が生成されず、致命的なエラーが「リーク」する方法。
xdebugを有効にして、これをローカルで再現できます:
try {
$soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
$exceptionMessage = t($e->getMessage());
print_r($exceptionMessage);
}
これにより、catch句を入力しなくても、説明した致命的なエラーが発生します。
Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'
呼び出しの直前にxdebugを無効にすると動作します:
xdebug_disable();
try {
$soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
$exceptionMessage = t($e->getMessage());
print_r($exceptionMessage);
}
これは期待どおりに例外をトリガーし、次のメッセージを含むcatch句で適切なSoapFaultオブジェクトを取得します。
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'
したがって、基本的に例外は公示どおりに機能します。ケースで動作しない場合は、xdebugバグ、または別のサードパーティコンポーネントで同様の問題が発生している可能性があります。
他のヒント
引用 SoapClientドキュメント:
例外オプションは、soapエラーがSoapFault型の例外をスローするかどうかを定義するブール値です。
したがって、次のようなものを試してください:
$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));
この方法は、 SoapFault 例外をスローして、キャッチできるようにします。 。
参照: http://bugs.xdebug.org/view.php?id= 249
可能な解決策:
Index: trunk/www/sites/all/libraries/classes/defaqtoSoapClient.class.php
===================================================================
--- classes/defaqtoSoapClient.class.php
+++ classes/defaqtoSoapClient.class.php
@@ -31,10 +31,23 @@
try {
+ // xdebug and soap exception handling interfere with each other here
+ // so disable xdebug if it is on - just for this call
+ if (function_exists('xdebug_disable')) {
+ xdebug_disable();
+ }
//Create the SoapClient instance
parent::__construct($wsdl, $options);
}
catch(Exception $parent_class_construct_exception) {
+ if (function_exists('xdebug_enable')) {
+ xdebug_enable();
+ }
// Throw an exception an say that the SOAP client initialisation is failed
throw $parent_class_construct_exception;
+ }
+ if (function_exists('xdebug_enable')) {
+ xdebug_enable();
}
}
URLが有効であることを確認するために、curlまたはfsockopenリクエストを試行することができます。
参考までに、SoapClientとPHPUnitを使用してリモートWebServicesをテストしていますが、同じ問題が発生しました!
- サードパーティとして古いPHPUnitバージョン(3.3.x)を使用すると、phpunitがクラッシュします
- 現在のバージョンのPHPUnit(3.4.6)をサードパーティとして使用する場合、phpunitは" RuntimeException"を表示します。
これが私の最初のテスト方法です:
public function testUnavailableURL() { $client = new SoapClient("http://wrong.URI"); }
PHPUnitの最初の結果は次のとおりです。
There was 1 error: 1) MyTestCase::testUnavailableURL RuntimeException: FAILURES!
ここに私の2番目のテスト方法があります:
public function testUnavailableURL() { try { $client = @new SoapClient("http://wrong.URI"); } catch (SoapFault $fault) { print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})"; } }
PHPUnitの2番目のテスト結果は次のとおりです。
PHPUnit 3.4.6 by Sebastian Bergmann. .SOAP Fault: (faultcode: WSDL, faultstring: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://wrong.URI' : failed to load external entity "http://wrong.URI" )... Time: 3 seconds, Memory: 4.25Mb OK
NB:この件名でphpunitチケットを見つけました:チケット417