Проверка URL действительна (из мыла php) - PullRequest
13 голосов
/ 10 сентября 2009

Я пишу веб-приложение, которое позволит пользователю указать URL-адрес для SoapClient. Я хотел проверить, что php может подключаться к клиенту, когда пользователь отправляет форму. Я мог бы сделать это с помощью try catch или set_error_handler (или некоторой комбинации из двух). Однако похоже, что это невозможно для фатальных ошибок. Есть ли способ заставить SoapClent тестировать URL, который не выдаст неисправимую ошибку?

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

Я хочу, чтобы он отмечал ошибку, поскольку URL-адрес не существует, но я хотел бы иметь возможность его перехватить.

В противном случае я полагаю, что мог бы попытаться загрузить и проверить URL-адрес самостоятельно, но я бы подумал, что это можно будет сделать из SoapClient.

Должна ли это быть фатальная ошибка?

Редактировать

Прочитав ответ rogeriopvl, я вновь заявляю, что должен был сказать, что я пытался использовать опцию «исключения» для конструктора soapclient и (в отчаянии) использовать функцию-soap-error-handler.

Ответы [ 5 ]

23 голосов
/ 14 сентября 2009

Вы используете 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);
}

Это вызывает исключение, как и ожидалось, и я получаю правильный объект SoapFault в предложении catch с сообщением:

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

Так что в основном исключения работают как рекламируется. Если они не работают в вашем случае, вы можете столкнуться с ошибкой xdebug или аналогичной проблемой с другим сторонним компонентом.

1 голос
/ 04 июля 2011

См .: 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();
     }
   }
1 голос
/ 10 сентября 2009

Цитирование Документация SoapClient :

Параметр исключения - логическое значение, определяющее, генерируют ли ошибки мыла исключения типа SoapFault.

Так что вы должны попробовать что-то вроде:

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

Этот способ будет генерировать SoapFault исключения, позволяющие вам их перехватить.

0 голосов
/ 29 января 2010

Для вашей информации, я использую SoapClient с PHPUnit для тестирования удаленных веб-сервисов и получил ту же проблему!

  • при использовании старой версии 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!

Вот мой второй метод испытаний:

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

Вот второй результат теста PHPUnit:

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

Примечание: я нашел билет phpunit на эту тему: билет 417

0 голосов
/ 14 сентября 2009

Вы можете попробовать сделать запрос curl или fsockopen, чтобы проверить, что URL действителен.

...