Cet article partage principalement avec vous l'erreur mysql du programme PHP résidant en mémoire. Dans l'environnement cli, le programme PHP doit fonctionner pendant une longue période et la communication. entre le client et le serveur MySQL, les connexions TCP sont instables.
Les raisons de l'instabilité peuvent être les suivantes :
MySQL-Server coupera automatiquement la connexion dans un certain laps de temps
PHP Lorsque le programme rencontre une période d'inactivité et qu'il n'y a pas de requêtes MySQL pendant une longue période, MySQL-Server coupera également la connexion pour recycler les ressources
Dans d'autres cas , exécutez le processus kill sur le serveur MySQL pour couper une certaine connexion, et le serveur MySQL redémarre
Gigue du réseau
À ce moment, la connexion MySQL dans le programme PHP échoue. Si mysql_query est toujours exécuté, une erreur MySQL server has gone away
sera signalée. Si le programme ne peut pas le gérer, il rencontre directement une erreur fatale et se termine. Par conséquent, le programme PHP doit se déconnecter et se reconnecter.
De nombreuses personnes ont proposé la mysql_ping
solution, qui consiste à effectuer une détection de connexion ou une détection de connexion planifiée à chaque fois mysql_query
.
Cette solution n'est pas la meilleure. La raison est la suivante : mysql_ping
Il doit détecter activement la connexion, ce qui entraîne une consommation supplémentaire. L'exécution de mysql_ping
régulièrement ne peut pas résoudre le problème. Par exemple, la connexion est fermée juste après l'exécution de la détection mysql_ping
Le principe est : mysql_query
Vérifiez la valeur de retour après l'exécution. Si mysql_query
ne parvient pas à revenir, le code d'erreur de détection s'avère être 2006/2013(这2个错误表示连接失败)
. Exécutez à nouveau mysql_connect
. Après avoir exécuté mysql_connect
, réexécutez mysql_query
. mysql_query
revient avec succès, puis la connexion est valide et il s'agit d'un appel normal.
méthode de requête dans swoole_framework.
$res = mysql_query($sql, $this->conn);if ($res === false) { if (mysql_errno($this->conn) == 2006 or mysql_errno($this->conn) == 2013) { $r = $this->checkConnection(); if ($r === true) { continue; } }
exécuter la méthode de la classe de connexion à la base de données dans Workererman.
protected function execute($query, $parameters = "") { try { ... } catch (PDOException $e) { // 服务端断开时重连一次 if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { $this->closeConnection(); $this->connect(); ... } }
Évidemment, la capture du code d'erreur et la déconnexion et la reconnexion sont une solution très fiable et peu coûteuse. Il est recommandé à tout le monde de l'utiliser dans un environnement permanent.
TP+workman À partir de la version V5.0.6+
, TP prend en charge le mécanisme de déconnexion et de reconnexion de Mysql. Il est désactivé par défaut. nécessaire, application/databases.php
Ajoutez
// 开启断线重连'break_reconnect' => true,
au fichier de configuration de la base de données et tout ira bien.
Recommandations associées :
Le programme PHP résident en mémoire mysql signale une erreur
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!