[spip-dev] Api sql et mysql : Prévenir les gone Away 2006

Bonjour tout le monde

Certains plugins ou scripts peuvent génerer une erreur 2006 car le
temps d'attente du serveur est dépassé. La requete en cours part en
vrille mais aussi toute les requetes qui suivent dans le même
processus PHP.
On peut limiter la casser en faisant un test préalable lors
l'éxécution de la requete via mysql_ping et mysqli_ping.

En gros le patch est (pour 2.1) :
function spip_mysql_query()
....
    if (!mysql_ping($connexion['link'])) {
        mysql_close($connexion['link']);
        unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
        spip_connect($serveur);
        $connexion = &$GLOBALS['connexions'][$serveur ?
strtolower($serveur) : 0];
    }

En gros on ferme la connexion en cours et on tente de relancer une
nouvelle avant d'éxecuter une requête.

Avant d'aller plus loin, j'aimerai savoir s'il y a des contres indications ?

De plus je constate un problème avec l'api dans spip 3.0 nous faisons
des mysqli_query() sans passer par spip_mysql_query() ce qui me semble
une erreur d'implémentation.

Km

Ciao

Suite à discussion sur IRC. Merci jluc. L'idée proposée est assez
mauvaise on exécute pour chaque requete SQL une seconde de test. Il
vaut mieux le faire uniquement quand cela est utile. Voici une seconde
proposition, au moment de la capture de l'erreur on retente sa chance
si on est en erreur 2006

function spip_mysql_query()

    $r = $link ? mysql_query($query, $link) : mysql_query($query);

    if ($e = spip_mysql_errno($serveur)) { // Log d'un Gone Away
        if ($e == 2006) { //Si Gone Away on relance une connexion vierge
            mysql_close($connexion['link']);
            unset($GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]);
            spip_connect($serveur);
            $connexion = &$GLOBALS['connexions'][$serveur ?
strtolower($serveur) : 0];
            //On retente au cas où
            $r = $link ? mysql_query($query, $link) : mysql_query($query);
        }
    }

Ciao

Le patch a été comité sur le trunk (avec mysqli) et sur la branche 2.1 (mysql)

Km