2010-07-10 21 views
2

J'ai créé un service Web SOAP basé sur WSDL en utilisant PHP 5.3. J'utilise Zend Framework pour gérer le service, et ZF à son tour est placé au-dessus de la classe SoapServer intégrée de PHP. En testant avec SoapUI, j'ai découvert que passer un paramètre de type invalide (par exemple, en passant une chaîne quand un entier est défini par le WSDL) a entraîné une réponse vide. Creuser dans le code, j'ai découvert que lorsque les appels ZF SoapServer-> poignée(), l'exécution meurt avec cette erreur fatale:Impossible de gérer les erreurs dans la méthode SoapServer-> handle() de PHP

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

L'erreur est logique, mais pour la vie de moi, je ne peux pas comprendre comment capture-le afin que je puisse le gérer avec élégance. Ma compréhension est que handle() devrait lancer une exception, mais il est simplement en train de mourir.

Mais ici est là que ça devient vraiment bizarre ....

L'exécution de plusieurs tests avec SoapUI, sans apporter de modifications de code, produit des résultats différents. La plupart du temps, je reçois la réponse vide, mais de temps en temps, je récupère un SoapFault (ce à quoi je m'attendrais!). Ce n'est pas cohérent, cependant, et je ne peux pas comprendre ce qui le déclenche de toute façon. Pour autant que je sache, les fonctionnalités de mise en cache de SoapUI sont désactivées, ainsi que la mise en cache WSDL. Je ne sais pas si c'est quelque chose avec SoapUI ou PHP. Comme je l'ai dit, bizarre.

connexes, je l'ai trouvé ce vieux bug PHP:

http://bugs.php.net/36629

qui sonne un terrible comme mon propre problème. Cependant, je ne suis pas complètement convaincu que c'est mon problème, principalement parce que la documentation PHP couvrant tout cela, ainsi que les documents pour ZF, sont terriblement incomplètes. Ainsi, je peux très bien simplement faire quelque chose de terriblement mal et ne pas le savoir. À la lumière de cela, j'aimerais voir une coquille simple qui montre la bonne façon de piéger et de gérer les erreurs. Mais je vais prendre toute l'aide que les gens là-bas peuvent être en mesure d'offrir.

+0

Est-ce que ce bug est rapporté? http://bugs.php.net/bug.php?id=49513 – MrWhite

+0

Je le crois. En fait, il semble que tout cela soit lié: http://bugs.php.net/bug.php?id=36629 http://bugs.php.net/bug.php?id=50547 http://bugs.php.net/bug.php?id=50895 http://bugs.php.net/bug.php?id=50547 http://bugs.php.net/bug.php? id = 49513 –

Répondre

0

Si vous envoyez une mauvaise XML, Zend Framework envoyer un SoapFault Exception:

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

Avec ce code, seule exception a été transformé en SoapFault. Mais erreur PHP ne jetez pas exception et SoapServer affiche pas erreur:

// 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; 
} 

Je ne sais pas comment revenir SoapFault tous les temps. Pardon. Je recherche ...;)

1

Pourriez-vous essayer commentaire: https://bugs.php.net/bug.php?id=50547#1298563236 (troisième commentaire sur la page)? J'ai eu exactement le même problème (parfois une réponse vide, parfois un SoapFault correct). xdebug_disable() m'a sauvé.