2009-09-10 9 views
13

Ich schreibe eine Web-App, die es dem Benutzer ermöglicht, eine URL für einen SoapClient anzugeben. Ich wollte validieren, dass PHP eine Verbindung zum Client herstellen kann, wenn der Benutzer ein Formular einreicht. Ich konnte dies über try catch oder set_error_handler (oder eine Kombination der beiden) tun. Bei schwerwiegenden Fehlern ist dies jedoch nicht möglich. Gibt es eine Möglichkeit, SoapClent dazu zu bringen, eine URL zu testen, die keinen Fehler verursacht?Überprüfung einer URL ist gültig (aus PHP-Soap-Client)

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

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

Sonst könnte ich versuchen, die URL selbst herunterzuladen und zu validieren, aber ich hätte gedacht, dass es vom SoapClient aus möglich wäre.

Sollte dies ein schwerwiegender Fehler sein?

bearbeiten

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

Antwort

22

Verwenden Sie xdebug? Laut this PHP bug report and discussion, das Problem wurde mindestens seit PHP 5.1 behoben, aber this xdebug bug vermasselt mit "fataler Fehler zu Ausnahmekonvertierungen" in einer Weise, dass die Ausnahme nicht generiert wird und der schwerwiegende Fehler "durchleckt".

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 kurz vor dem Anruf:

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önnen Sie auf den Fehler xdebug oder ein ähnliches Problem mit einer anderen Drittanbieterkomponente stoßen.

+0

xdebug hat Fehler. Das ist neu für mich, danke. –

+4

Es war auch neu für mich - es gibt nicht viele Dinge, die nerviger sind als die Suche nach Bugs, die vom Debugger selbst verursacht werden:/ –

+1

Es war ein Xdebug Bug, aber ich habe das vor kurzem behoben. Es ist jedoch noch nicht Teil einer Veröffentlichung. – Derick

1

SoapClient documentation Zitiert:

Die Ausnahmen Option ist ein boolescher Wert definiert, ob Seife Fehler Ausnahmen vom Typ SoapFault werfen.

So sollten Sie versuchen, so etwas wie:

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

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

+0

Ich habe versucht, dass hat nicht funktioniert, sollte setzen es in der Frage, mein Schlechter, ich werde aktualisieren. –

0

Sie könnten versuchen und eine curl oder fsockopen Anfrage zu überprüfen, ob die URL gültig ist.

+0

Dies überprüft, ob etwas von der URL abgerufen werden kann, überprüft jedoch nicht, ob es sich um eine echte WSDL-Datei handelt. –

0

Zu Ihrer Information verwende ich SoapClient mit PHPUnit, um Remote WebServices zu testen, und habe das gleiche Problem!

  • wenn eine alte PHPUnit-Version (3.3.x) als Dritter mit, phpunit Absturz
  • wenn aktuelle Version von PHPUnit (3.4.6) als Dritter, phpunit Anzeige "Runtime" verwenden.

Hier ist meine erste Testmethode:

 
There was 1 error: 

1) MyTestCase::testUnavailableURL 
RuntimeException: 


FAILURES! 

Hier ist meine zweite Testmethode:

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

Hier erstes Ergebnis PHPUnit ist

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

Hier PHPUnit ist zweites 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

1

See: 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(); 
    } 
    } 
+0

Eine bessere Lösung ist bereits Teil des Xdebug github Repository. – Derick

Verwandte Themen