So stellen Sie die Verbindung automatisch wieder her, wenn PHP eine Verbindung zu MySql herstellt

不言
Freigeben: 2023-03-24 14:28:02
Original
2227 Leute haben es durchsucht

Wenn die MySQL-Verbindung unterbrochen wird, schlägt die nachfolgende Ausführung der Schleife fehl. In diesem Artikel wird hauptsächlich die Methode der automatischen erneuten Verbindung vorgestellt, wenn PHP eine Verbindung zu MySQL herstellt. Sie ist sehr gut und hat einen Referenzwert. Interessierte Freunde sollten gemeinsam lernen, PHP als Hintergrundprogramm zu verwenden (z. B. Gruppen-SMS). ). Um PHP im CLI-Modus auszuführen, muss PHP eine Verbindung zu MySQL herstellen, um die Datenbankverarbeitung in einer Schleife durchzuführen.

Wenn die MySQL-Verbindung unterbrochen wird, schlägt die nachfolgende Ausführung der Schleife fehl.

Wir müssen eine Methode entwerfen, die die Verbindung automatisch wiederherstellen kann, wenn die MySQL-Verbindung getrennt wird, damit nachfolgende Programme normal ausgeführt werden können.

1. Erstellen Sie eine Testdatentabelle


CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Nach dem Login kopieren


2. Testdaten einfügen


insert into user(name) values('fdipzone'),('xfdipzone'),('terry');
mysql> select * from user;
+----+-----------+
| id | name |
+----+-----------+
| 1 | fdipzone |
| 2 | xfdipzone |
| 3 | terry |
+----+-----------+
Nach dem Login kopieren


3. PHP-Datei läuft im Hintergrund

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;
}
}
?>
Nach dem Login kopieren


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);
}
?>
Nach dem Login kopieren


4. Ausführungsschritte Führen Sie test.php im PHP-CLI-Modus aus und führen Sie dann sofort mysql.server stop und mysql.server start aus, um eine Flash-Unterbrechung zu simulieren


mysql.server stop
Shutting down MySQL
.. SUCCESS! 
mysql.server start
Starting MySQL
SUCCESS!
Nach dem Login kopieren


Wie Sie sehen, kann die Datenbank nach der Unterbrechung nicht wieder verbunden werden und nachfolgende Programme können nicht ausgeführt werden.


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
...
Nach dem Login kopieren


5. Wiederverbindungsmechanismus hinzufügen


if(isset(self::$_instance) && !empty(self::$_instance)){
return self::$_instance;
}
Nach dem Login kopieren


Da der Wert von self::$_instance vorhanden ist, stellt der Aufruf von get_conn keine erneute Verbindung her, sondern verwendet die gespeicherte Verbindung für Verarbeitung.

Dies bedeutet tatsächlich, dass bei bestehender Verbindung keine erneute Erstellung einer MySQL-Verbindung erforderlich ist, wodurch die Anzahl der MySQL-Verbindungen verringert wird.

Daher ist es notwendig, den Wert von self::$_instance nach der Unterbrechung zu löschen, damit die Verbindung beim nächsten Mal wieder hergestellt werden kann, ohne die erstellte, aber abgelaufene Datenbankverbindung zu verwenden.

Die Verbesserungsmethode lautet wie folgt:

Reset_connect-Methode hinzufügen, die aufgerufen wird, wenn ein Fehler auftritt. Wenn festgestellt wird, dass der Fehler verschwunden ist, wird die bestehende Datenbankverbindung gelöscht. Nach dem Löschen wird MySQL beim nächsten Mal wieder verbunden.

Die geänderte PHP-Datei lautet wie folgt:

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;
}
}
}
?>
Nach dem Login kopieren


6. Führen Sie die Flash-Ausführung erneut durchSie können den verbesserten Effekt sehen. Nach der Flash-Unterbrechung schlägt die aktuelle Ausführung fehl, nachfolgende Verbindungen können jedoch erneut ausgeführt werden. erstellt, um weiterzumachen.


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
...
Nach dem Login kopieren


Verwandte Empfehlungen:

Verstümmelte Zeichen treten auf, nachdem PHP eine Verbindung zur MySQL-Datenbank hergestellt hat

So verbinden Sie PHP mit MySQL – MySQLi und PDO


Das obige ist der detaillierte Inhalt vonSo stellen Sie die Verbindung automatisch wieder her, wenn PHP eine Verbindung zu MySql herstellt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage