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;
2. Testdaten einfügen
insert into user(name) values('fdipzone'),('xfdipzone'),('terry'); mysql> select * from user; +----+-----------+ | id | name | +----+-----------+ | 1 | fdipzone | | 2 | xfdipzone | | 3 | terry | +----+-----------+
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['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; } } ?>
<?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. 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!
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 ...
5. Wiederverbindungsmechanismus hinzufügen
if(isset(self::$_instance) && !empty(self::$_instance)){ return self::$_instance; }
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; } } } ?>
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 ...
Verwandte Empfehlungen:
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!