質問

ユーザーが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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top