13

ユーザーが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から実行できると思いました。

これは致命的なエラーである必要がありますか?

編集

rogeriopvlの回答を読んだ後、soapclientコンストラクターと(必死になって)use-soap-error-handler関数の「例外」オプションを試したと言っておくべきだったと思います。

4

5 に答える 5

23

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のバグ、または別のサードパーティコンポーネントで同様の問題が発生する可能性があります。

于 2009-09-14T12:57:33.923 に答える
1

SoapClientドキュメントの引用:

例外オプションは、soapエラーがSoapFaultタイプの例外をスローするかどうかを定義するブール値です。

したがって、次のようなことを試してください。

$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));

この方法では、SoapFault例外がスローされ、それらをキャッチできます。

于 2009-09-10T17:50:49.160 に答える
1

参照: 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();
     }
   }
于 2011-07-04T16:06:47.323 に答える
0

参考までに、PHPUnitでSoapClientを使用してリモートWebサービスをテストしていますが、同じ問題が発生しました。

  • 古いPHPUnitバージョン(3.3.x)をサードパーティとして使用すると、phpunitがクラッシュします
  • 現在のバージョンのPHPUnit(3.4.6)をサードパーティとして使用している場合、phpunitは「RuntimeException」を表示します。

これが私の最初のテスト方法です:

パブリック関数testUnavailableURL(){
    $ client = new SoapClient( "http://wrong.URI");
}

PHPUnitの最初の結果は次のとおりです。

1つのエラーがありました:

1)MyTestCase :: testUnavailableURL
RuntimeException:


失敗!

これが私の2番目のテスト方法です:

パブリック関数testUnavailableURL(){
        試す {
          $ client = @new SoapClient( "http://wrong.URI");
        } catch(SoapFault $ fault){
          print "SOAP Fault:(faultcode:{$ fault-> faultcode}、faultstring:{$ fault-> faultstring})";
        }
}

PHPUnitの2番目のテスト結果は次のとおりです。

セバスティアンバーグマンによるPHPUnit3.4.6。

.SOAP障害:(障害コード:WSDL、障害文字列:SOAP-エラー:WSDLの解析:「http://wrong.URI」からロードできませんでした:外部エンティティ「http://wrong.URI」のロードに失敗しました
)..。

時間:3秒、メモリ:4.25Mb

わかった

NB:私はこの主題に関するphpunitチケットを見つけました:チケット417

于 2010-01-29T14:43:33.620 に答える
0

curlまたはfsockopenリクエストを実行して、URLが有効であることを確認できます。

于 2009-09-14T06:51:20.053 に答える