Heim >Datenbank >MySQL-Tutorial >So stellen Sie die Verbindung automatisch wieder her, wenn PHP eine Verbindung zu MySql_MySQL herstellt
Verwenden Sie PHP als Hintergrundprogramm (z. B. für Massentextnachrichten) und führen Sie PHP im CLI-Modus aus. PHP muss 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-Dateien, die im Hintergrund ausgeführt werden
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. Schritte ausführen
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; }
Nach der Unterbrechung stellt der Aufruf von get_conn keine erneute Verbindung her, da der Wert von self::$_instance vorhanden ist, sondern verwendet die gespeicherte Verbindung zur 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 Datenbankverbindung zu verwenden, die erstellt wurde, aber fehlgeschlagen ist.
Die Verbesserungsmethode ist 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
<?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; 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 durch
Sie können den verbesserten Effekt sehen. Nach der Unterbrechung schlägt die aktuelle Ausführung fehl, nachfolgende Ausführungen können jedoch neu erstellt werden und eine neue Verbindung wird fortgesetzt.
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 ...
Die oben beschriebene Methode zeigt Ihnen, wie Sie die Verbindung automatisch wiederherstellen können, wenn PHP eine Verbindung zu MySql herstellt. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht Sie rechtzeitig. Vielen Dank für Ihre Unterstützung der Website!