ZendFramework logo

Voici un article que vous allez certainement trouver inutile. Mais c'est le genre d'article qui peut sauver la vie d'un newbie en stage ;-)

La grande question : Comment éviter les erreurs TCP générés par le Zend_Http_Client ?

Deux solutions :

  • Mettre en place des catch d'exception au niveau applicatif et gérer un retry manuel => Bof ..
  • Réécrire la classe Zend_Http_Client_Adapter_Socket pour gérer un retry automatique de la création de la socket => YES !

Il suffit pour cela de replacer le code suivant qui se trouve à la ligne 225 du fichier /Zend/Http/Client/Adapter/Socket.php

$this->socket = @stream_socket_client($host . ':' . $port,
                                                  $errno,
                                                  $errstr,
                                                  (int) $this->config['timeout'],
                                                  $flags,
                                                  $context);

par :

$max_retry = 5;

for ($i = 0; $i < $max_retry; $i++) {

      $this->socket = @stream_socket_client($host . ':' . $port,
                                      $errno,
                                      $errstr,
                                      (int) $this->config['timeout'],
                                      $flags,
                                      $context);

     // If socket is OK
     if ($this->socket) {
           break;
     }

    sleep(1);
}

Le hack est très simple, et vous voilà sauvé des problèmes de connexions qui sautent ... ;-)

1. Le , 12:47 par AlexNoox
e4bb07a364870ef3ee41670c25ea983c

Je suis pas sûr que ce soit une si bonne idée..

En effet le problème initial est résolu, mais :
- Si tu met à jour zend framework -> ça marche plus.
- Ce n'est pas le but initial de cette méthode, elle gère la connexion tout court et renvoi bien une exception en cas d'erreur.
- Si au bout de 5 connexions ca fonctionne toujours pas, tu es quand même obligé de mettre en place un try/catch

Je pense que le retry manuel est donc la solution la plus maintenable, évolutive et dans la philosophie objet et d'intégrité du framework.

PS : désolé de jouer les rabat-joies ;)

2. Le , 20:01 par Ludovi Toinel
9ab09dd3e305f924f8930e20e1a35843

Je suis d'accord avec toi pour la maintenabilité. Je dois demander a zend d'integrer ma contribution :-)
Il faudrait mettre le maxretry dans l'objet de configuration.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.