Не удается обработать ошибки в методе PHP SoapServer-> handle () - PullRequest
2 голосов
/ 10 июля 2010

Я создал веб-сервис SOAP на основе WSDL с использованием PHP 5.3.Я использую Zend Framework для управления сервисом, а ZF, в свою очередь, размещен поверх встроенного в PHP класса SoapServer.

При тестировании с SoapUI я обнаружил, что передача параметра недопустимого типа (например, передачастрока, когда целое число определено WSDL) привело к пустому ответу.Копаясь в коде, я обнаружил, что, когда ZF вызывает SoapServer-> handle (), выполнение умирает с этой фатальной ошибкой:

Fatal error: SOAP-ERROR: Encoding: Violation of encoding rules

Ошибка имеет смысл, но я не могу понять, что это за жизнькак захватить это так, чтобы я мог изящно обращаться с этим.Насколько я понимаю, что handle () должен генерировать исключение, но вместо этого он просто умирает.

Но вот где это становится действительно странным ....

Запуск нескольких тестов с помощью SoapUI без каких-либоКод меняется, дает разные результаты.В большинстве случаев я получаю пустой ответ, но иногда я возвращаю SoapFault (что я и ожидал!).Это не соответствует, однако, и я не могу понять, что вызывает это в любом случае.Насколько я могу судить, у меня отключены функции кэширования в SoapUI, а также кэширование WSDL.Я не знаю, что-то с SoapUI или PHP.Как я уже сказал, странно.

Связанный, я нашел эту старую ошибку PHP:

http://bugs.php.net/36629

, которая звучит ужасно, как моя собственная проблема.Однако я не совсем уверен, что это моя проблема, в основном потому, что документация PHP, охватывающая все это, а также документы для ZF, ужасно неполны.Таким образом, я вполне могу просто делать что-то ужасно неправильное и не знать об этом.В свете этого я хотел бы увидеть простую оболочку, которая показывает правильный способ отловить и обработать ошибки.Но я возьму любую помощь, которую могут предложить люди.

Ответы [ 2 ]

1 голос
/ 20 апреля 2012

Не могли бы вы попробовать комментарий: https://bugs.php.net/bug.php?id=50547#1298563236 (третий комментарий на странице)?

Xdebug может быть проблемой. При использовании xdebug_disable () перед вызовом Метод handle (), сервер отвечает правильным SOAP-сообщением, которое говорит, что что-то пошло не так.

У меня была точно такая же проблема (иногда пустой ответ, иногда правильный SoapFault). xdebug_disable() спас меня.

0 голосов
/ 03 января 2011

Если вы отправляете неверный XML, Zend Framework отправляет исключение SoapFault:

// Zend/Soap/Server.php line 818
try {
    $this->_setRequest($request);
} catch (Zend_Soap_Server_Exception $e) {
    $setRequestException = $e;
}

С этим кодом только исключение было преобразовано в SoapFault.Но все ошибки PHP не вызывают исключение, и SoapServer не отображает ошибку:

// Zend/Soap/Server.php line 857
protected function _initializeSoapErrorContext()
{
    $displayErrorsOriginalState = ini_get('display_errors');
    // Delete this line to view error in developement
    ini_set('display_errors', false);

    set_error_handler(array($this, 'handlePhpErrors'), E_USER_ERROR);
    return $displayErrorsOriginalState;
}

Я не знаю, как вернуть SoapFault все время.Сожалею.Я ищу ...;)

...