Maison  >  Article  >  développement back-end  >  Comment se reconnecter automatiquement lorsque PHP se connecte à MySql

Comment se reconnecter automatiquement lorsque PHP se connecte à MySql

不言
不言original
2018-04-20 13:27:262178parcourir

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[&#39;host&#39;];
$dbname = $config[&#39;dbname&#39;];
$dbuser = $config[&#39;user&#39;];
$dbpasswd = $config[&#39;password&#39;];
$pconnect = $config[&#39;pconnect&#39;];
$charset = $config[&#39;charset&#39;];
$dsn = "mysql:host=$dbhost;dbname=$dbname;";
try {
$h_param = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
);
if ($charset != &#39;&#39;) {
$h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = &#39;SET NAMES &#39; . $charset; //設置默認編碼
}
if ($pconnect) {
$h_param[PDO::ATTR_PERSISTENT] = true;
}
$conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);
} catch (PDOException $e) {
throw new ErrorException(&#39;Unable to connect to db server. Error:&#39; . $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 &#39;db.php&#39;;
// 数据库设定
$config = array(
&#39;host&#39; => &#39;localhost&#39;,
&#39;dbname&#39; => &#39;user&#39;,
&#39;user&#39; => &#39;root&#39;,
&#39;password&#39; => &#39;&#39;,
&#39;pconnect&#39; => 0,
&#39;charset&#39; => &#39;&#39;
);
// 循环执行
while(true){
// 创建数据连接
$dbconn = DB::get_conn($config);
// 执行查询
$sqlstr = &#39;select * from user where id=?&#39;;
$condparam = array(mt_rand(1,3));
$data = DB::query($dbconn, $sqlstr, $condparam);
print_r($data);
// 延时10秒
echo &#39;sleep 10&#39;.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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn