Lorsque la connexion mysql est interrompue, l'exécution ultérieure de la boucle échouera. Cet article présente principalement la méthode de reconnexion automatique lorsque PHP se connecte à MySql. C'est très bien et a une valeur de référence. Les amis intéressés devraient apprendre ensemble
Utiliser PHP comme programme exécuté en arrière-plan (comme la messagerie texte de groupe). ). Pour exécuter php en mode cli, php doit se connecter à mysql pour effectuer le traitement de la base de données en boucle.
Lorsque la connexion mysql est interrompue, l'exécution ultérieure de la boucle échouera.
Nous devons concevoir une méthode qui puisse se reconnecter automatiquement lorsque MySQL est déconnecté, afin que les programmes suivants puissent s'exécuter normalement.
1. Créer un tableau de données de test
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. Insérer les données de test
insert into user(name) values('fdipzone'),('xfdipzone'),('terry'); mysql> select * from user; +----+-----------+ | id | name | +----+-----------+ | 1 | fdipzone | | 2 | xfdipzone | | 3 | terry | +----+-----------+
3. Fichier PHP exécuté en arrière-plan
db.php
<?php // 数据库操作类 class DB{ // 保存数据库连接 private static $_instance = null; // 连接数据库 public static function get_conn($config){ if(isset(self::$_instance) && !empty(self::$_instance)){ return self::$_instance; } $dbhost = $config['host']; $dbname = $config['dbname']; $dbuser = $config['user']; $dbpasswd = $config['password']; $pconnect = $config['pconnect']; $charset = $config['charset']; $dsn = "mysql:host=$dbhost;dbname=$dbname;"; try { $h_param = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ); if ($charset != '') { $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼 } if ($pconnect) { $h_param[PDO::ATTR_PERSISTENT] = true; } $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param); } catch (PDOException $e) { throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31); } self::$_instance = $conn; return $conn; } // 执行查询 public static function query($dbconn, $sqlstr, $condparam){ $sth = $dbconn->prepare($sqlstr); try{ $sth->execute($condparam); } catch (PDOException $e) { echo $e->getMessage().PHP_EOL; } $result = $sth->fetchAll(PDO::FETCH_ASSOC); return $result; } } ?>
test.php
<?php require 'db.php'; // 数据库设定 $config = array( 'host' => 'localhost', 'dbname' => 'user', 'user' => 'root', 'password' => '', 'pconnect' => 0, 'charset' => '' ); // 循环执行 while(true){ // 创建数据连接 $dbconn = DB::get_conn($config); // 执行查询 $sqlstr = 'select * from user where id=?'; $condparam = array(mt_rand(1,3)); $data = DB::query($dbconn, $sqlstr, $condparam); print_r($data); // 延时10秒 echo 'sleep 10'.PHP_EOL.PHP_EOL; sleep(10); } ?>
4. Étapes d'exécution
Exécutez test.php en mode php cli, puis exécutez immédiatement mysql.server stop et mysql.server start pour simuler une interruption flash
mysql.server stop Shutting down MySQL .. SUCCESS! mysql.server start Starting MySQL SUCCESS!
Comme vous pouvez le constater, la base de données ne peut pas être reconnectée après l'interruption et les programmes suivants ne peuvent pas être exécutés.
Array ( [0] => Array ( [id] => 3 [name] => terry ) ) sleep 10 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away Array ( ) sleep 10 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away Array ( ) sleep 10 ...
5. Ajouter un mécanisme de reconnexion
if(isset(self::$_instance) && !empty(self::$_instance)){ return self::$_instance; }
Après l'interruption, parce que la valeur de self::$_instance existe, l'appel de get_conn ne se reconnectera pas, mais utilisera la connexion enregistrée pour. traitement.
Cela signifie en fait que lorsque la connexion existe, il n'est pas nécessaire de créer à nouveau une connexion mysql, réduisant ainsi le nombre de connexions mysql.
Il est donc nécessaire d'effacer la valeur de self::$_instance après l'interruption afin que la connexion puisse être réacquise la prochaine fois sans utiliser la connexion à la base de données qui a été créée mais expirée.
La méthode d'amélioration est la suivante :
Ajoutez la méthode reset_connect, qui est appelée lorsqu'une erreur se produit. Si l'erreur est considérée comme étant celle du serveur MySQL, la connexion à la base de données existante sera effacée. Après l'effacement, MySQL sera reconnecté la prochaine fois.
Le fichier php modifié est le suivant :
db.php
PDO::ERRMODE_EXCEPTION, ); if ($charset != '') { $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼 } if ($pconnect) { $h_param[PDO::ATTR_PERSISTENT] = true; } $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param); } catch (PDOException $e) { throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31); } self::$_instance = $conn; return $conn; } // 执行查询 public static function query($dbconn, $sqlstr, $condparam){ $sth = $dbconn->prepare($sqlstr); try{ $sth->execute($condparam); } catch (PDOException $e) { echo $e->getMessage().PHP_EOL; self::reset_connect($e->getMessage()); // 出错时调用重置连接 } $result = $sth->fetchAll(PDO::FETCH_ASSOC); return $result; } // 重置连接 public static function reset_connect($err_msg){ if(strpos($err_msg, 'MySQL server has gone away')!==false){ self::$_instance = null; } } } ?>
6. Effectuez à nouveau l'exécution du flash
Vous pouvez voir l'effet amélioré après l'interruption du flash, l'exécution en cours échouera, mais les connexions suivantes pourront être rétablies. créé pour continuer.
Array ( [0] => Array ( [id] => 2 [name] => xfdipzone ) ) sleep 10 SQLSTATE[HY000]: General error: 2006 MySQL server has gone away Array ( ) sleep 10 Array ( [0] => Array ( [id] => 1 [name] => fdipzone ) ) sleep 10 ...
Recommandations associées :
Des caractères tronqués apparaissent après la connexion de PHP à la base de données MySQL
Comment connecter PHP à MySQL - MySQLi et PDO
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!