Bir URL denetleme (php sabun istemci) geçerlidir

5 Cevap php

Ben kullanıcı bir SoapClient için bir URL belirtmek sağlayacak bir web uygulaması yazıyorum. Ben kullanıcı bir form gönderdiğinde php istemci bağlanabilir doğrulamak istiyordu. Ben try catch veya set_error_handler (veya ikisinin bir kombinasyonu) ile bu yapabilirdi thouhgt. Bu ölümcül hataları için mümkün değil gibi Ancak görünüyor. Kurtarılamayan bir hata atmak olmayacak bir URL'yi test etmek SoapClent almak için bir yolu var mı?

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

Ben bayrak için URL yoktur gibi bir hata onu istiyorum, ama onu yakalamak mümkün olmak istiyorum.

Aksi takdirde ben kendimi indirmek ve URL'yi doğrulamak için deneyebilirsiniz varsayalım, ama SoapClient bunu yapmak mümkün olacağını sanırdım.

Bu ölümcül bir hata olabilir mi?

Edit

Rogeriopvl cevabını okuduktan sonra ben SoapClient kurucu 'İstisnalar'ı seçeneği ve (çaresizlik içinde) kullanımı-sabun-hata-işleyici işlevi çalıştı söyledi gerektiğini reaslise.

5 Cevap

Eğer XDebug kullanıyor musunuz? this PHP bug report and discussion göre, konu PHP 5.1 'den beri en azından sabit olmuştur, ama this xdebug bug istisna değil oluşturulur bir şekilde' ölümcül durum dönüşüm hatası 've ölümcül karışıyor hatası 'ile sızdırıyor'.

Xdebug etkin olan ben, lokal bu üretebilir:

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

Bu bana bile yakalamak fıkra girmeden, tanımlanan ölümcül hata veriyor:

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

Aramadan önce It works if I disable xdebug Doğru:

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

Bu beklendiği gibi istisna tetikler, ve ben bir mesaj ile yakalamak fıkra uygun bir SoapFault nesnesi olsun:

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

Reklamı gibi Yani temelde istisnalar çalışır. Onlar sizin durumunuzda işe yaramazsa, başka bir 3. parti bileşen ile xdebug hata, ya da belki benzer bir sorunu karşılaşabilirsiniz.

Alıntı SoapClient documentation:

Istisnalar seçeneği sabun hataları tipi SoapFault istisnalar atmak olmadığını tanımlayan bir mantıksal değerdir.

Böylece gibi bir şey denemelisiniz:

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

Bu şekilde onları yakalamak için izin SoapFault istisnalar atmak olacaktır.

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

Olası çözüm:

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

Eğer URL geçerli olup olmadığını kontrol etmek bir kıvrılma veya fsockopen isteği denemek ve yapabilirdi.

Bilginiz için, ben uzaktan WebServices test PHPUnit ile SoapClient kullanarak ve aynı sorun var ben!

  • Üçüncü parti olarak eski bir PHPUnit sürümü (3.3.x) kullanırken, kaza phpunit
  • Üçüncü şahıs, phpunit ekran "RuntimeException" olarak PHPUnit güncel sürümü (3.4.6) kullanırken.

İşte benim ilk test yöntemi:

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

İşte ilk sonuç phpunit edilir:

There was 1 error:

1) MyTestCase::testUnavailableURL
RuntimeException: 


FAILURES!

İşte benim ikinci test yöntemi:

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

İşte ikinci test sonucu phpunit edilir:

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: ben bu konuda bir phpunit bilet bulundu: ticket 417