Frage

Ich schreibe einen Web-App, die der Benutzer eine URL ermöglicht eine Soapclient angeben. Ich wollte bestätigen, dass PHP an den Client eine Verbindung herstellen können, wenn der Benutzer ein Formular abschickt. Ich thouhgt ich dies über Try-Catch oder set_error_handler tun könnte (oder eine Kombination aus beiden). Allerdings sieht es so nicht möglich, fatale Fehler ist. Gibt es eine Möglichkeit SoapClent bekommen Sie eine URL zu testen, die nicht einen nicht behebbaren Fehler werfen?

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://example.com/wibble'

Ich will es Flagge einen Fehler als URL nicht existiert, aber ich möchte in der Lage sein, es zu fangen.

Ansonsten nehme ich an, ich könnte versuchen, die URL selbst herunterzuladen und zu validieren, aber ich hätte gedacht, dass es möglich wäre, sie von der Soapclient zu tun.

Sollte dies ein fataler Fehler sein?

Bearbeiten

Nach rogeriopvl Antwort Lesen ich reaslise, dass ich gesagt habe, sollte, dass ich versucht hatte, die ‚Ausnahmen‘ Option zum Soapclient-Konstruktor und (in Verzweiflung) die Verwendung-Seife-error-Handler-Funktion.

War es hilfreich?

Lösung

Sind Sie mit xdebug? Nach diesem PHP Bug-Report und Diskussion hat das Thema zumindest fest, da PHP 5.1, aber dieser xdebug Bug mit 'to Ausnahme Conversions fataler Fehler' verunstaltet in eine Art und Weise, dass die Ausnahme nicht erzeugt wird und die fatalen Fehler ‚Lecks durch‘.

Ich kann dies lokal reproduzieren, mit xdebug aktiviert:

try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Das gibt mir den fatalen Fehler, den Sie beschrieben, ohne auch nur die catch-Klausel eingeben:

Fatal error: SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Es funktioniert, wenn ich deaktivieren xdebug direkt vor dem Aufruf:

xdebug_disable();
try {
  $soapClient = new SoapClient('http://www.example.com');
}
catch(Exception $e) {
  $exceptionMessage = t($e->getMessage());
  print_r($exceptionMessage);
}

Dies löst die Ausnahme wie erwartet, und ich bekomme ein richtiges SoapFault Objekt in der catch-Klausel mit einer Meldung von:

SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.example.com'

Also im Grunde Ausnahmen arbeiten wie beworben. Wenn sie in Ihrem Fall nicht funktionieren, könnten Sie den xdebug Fehler auftreten, oder vielleicht ein ähnliches Problem mit einer anderen 3rd-Party-Komponente.

Andere Tipps

Soapclient Dokumentation :

  

Die Ausnahmen Option ein Boolescher Wert, der festlegt, ob Seife Fehler Ausnahmen vom Typ SoapFault werfen.

So sollte man so etwas versuchen:

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

Auf diese Weise wird werfen SoapFault Ausnahmen so dass Sie sie fangen .

Siehe auch: http://bugs.xdebug.org/view.php?id= 249

Mögliche Lösung:

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();
     }
   }

Sie könnten versuchen, und eine Locke oder fsockopen Antrag tun die URL zu überprüfen gilt.

Für Ihre Informationen, ich bin mit Soapclient mit PHPUnit Remote-WebServices zu testen und bekam das gleiche Problem!

  • bei Verwendung einer alte PHPUnit-Version (3.3.x) als Dritter, phpunit Absturz
  • bei der Verwendung von aktueller Version von PHPUnit (3.4.6) als Dritter, phpunit Anzeige "Runtime".

Hier ist meine erste Testmethode:

public function testUnavailableURL() {
    $client = new SoapClient("http://wrong.URI");
}

Hier ist PHPUnit erstes Ergebnis:

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

Hier ist meine zweite Testmethode:

public function testUnavailableURL() {
        try {
          $client = @new SoapClient("http://wrong.URI");
        } catch (SoapFault $fault) {
          print "SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})";
        }
}

Hier ist PHPUnit zweite Testergebnis:

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: Ich fand ein phpunit Ticket zu diesem Thema: Ticket 417

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top