ZendFramework-logo.png

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 ... ;-)