Проверка правильности URL-адреса (из php soap-клиента)
-
05-07-2019 - |
Вопрос
Я пишу веб-приложение, которое позволит пользователю указывать 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 и (в отчаянии) функцию use-soap-error-handler.
Решение
Используете ли вы 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 или, возможно, с аналогичной проблемой с другим сторонним компонентом.
Другие советы
Цитирование Документация SoapClient:
Параметр exceptions - это логическое значение, определяющее, вызывают ли ошибки soap исключения типа SoapFault.
Поэтому вам следует попробовать что-то вроде:
$client = new SoapClient("some.wsdl", array('exceptions' => TRUE));
Этот способ выбросит Ошибка в мыле исключения, позволяющие вам их перехватывать.
Видишь: 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();
}
}
вы могли бы попробовать выполнить запрос curl или fsockopen, чтобы проверить правильность URL-адреса.
К вашему сведению, я использую 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