2009-09-23 15 views
11

J'ai du mal à utiliser la classe mysqli en PHP et je n'ai pas réussi à trouver la réponse nulle part.Problème PHP de reconnexion mysqli

Dans mon script, une classe crée une connexion mysqli qu'elle utilise tout au long de ses fonctions. Ensuite, ce script fige. La connexion est également utilisée par les enfants, mais je rencontre le problème de la fermeture de la connexion (MYSQL Server Has Gone Away) dans le parent lorsque les enfants meurent. Avant de passer à mysqli (je n'utilisais que mysql), j'ai simplement appelé mysql_ping pour m'assurer que la connexion db était là avant d'exécuter la requête dans le processus parent. Mysqli a une fonction ping similaire MAIS il ne se reconnecte pas réellement si la connexion a disparu. J'ai essayé d'utiliser le paramètre global mysqli.reconnect = ON sans succès (en utilisant php.ini et ini_set). La fonction mysql_connect de php vous permet de récupérer une connexion déjà existante, donc si j'utilisais mysql au lieu de mysqli, je pourrais simplement réutiliser la connexion dans l'enfant juste après le processus forké. MAIS mysqli ne semble pas avoir une telle fonctionnalité ...

La seule chose que j'ai pu faire était d'appeler mysqli-> ping() et si cela renvoyait faux, puis de se reconnecter à la base de données dans le parent. C'est terriblement inefficace, et je préfèrerais savoir comment le faire correctement avec mysqli (et pas besoin de reconnexion manuelle) pour revenir à mysql.

Des suggestions?

Répondre

13

Le doc pour mysqli_ping() dit que si vous définissez l'option globale mysqli.reconnect-1 (dans votre php.ini) puis mysqli_ping() se reconnecter lorsqu'il détecte la connexion a disparu. Vous ne pouvez pas utiliser des connexions persistantes?

+3

Cela a fonctionné. Je n'ai pas réalisé que vous ne pouviez pas utiliser ini_set pour modifier cette variable, et étant le génie que je suis, j'ai ajouté la ligne à php.ini avant, ne sachant pas qu'il y avait déjà une ligne mysli.reconnect = Off plus bas fichier. Mais supprimer celui-là et simplement utiliser mysqli.reconnect a fonctionné et fait que mysqli-> ping() fonctionne exactement comme mysql_ping. Merci pour l'aide! –

0

u peut essayer quelque chose d'un peu différent .. au lieu de ping .. essayer d'envoyer une requête à faible intensité vraiment simple comme « select maintenant () "et voyez si vous obtenez de meilleurs résultats.

+0

la raison qui pourrait aider ... mysql vous voit comme un utilisateur actif au lieu de quelqu'un qui est juste en train de maintenir une connexion et de monopoliser les ressources .. je crois qu'il y a des paramètres de timeout dans my.ini/my.cnf qui affectent ce comportement .. si vous avez accès à cela, vous pouvez également regarder dans. –

0

Aussi, est-ce vraiment nécessaire de fork()?

-2

Je pense que vous devez définir mysqli.reconnect dans my.cng, qui est la config mysql, plutôt que php.ini, je n'ai pas réussi à changer de reconnexion via ini_set, mais mon administrateur sys l'a fait dans mon. cnf.

Donc, peu confus que d'autres l'ont fait dans les php.ini ....

+0

Pas vrai. 'my.cnf' ne concerne que le serveur MySQL, donc n'a généralement aucune influence sur un client PHP, et' mysqli' n'existe que dans PHP. [mysqli.reconnect] (http://www.php.net/manual/ en/mysqli.configuration.php # ini.mysqli.reconnect) * est * un paramètre de configuration PHP. – Synchro

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}