PHP が MySql に接続するときに自動的に再接続する方法

不言
リリース: 2023-03-24 14:28:02
オリジナル
2227 人が閲覧しました

mysql 接続が中断されると、その後のループの実行は失敗します。この記事では主に、PHP が MySql に接続する際の自動再接続の方法を紹介します。これは非常に優れており、興味のある友人は一緒に学ぶことができます

cli モードでバックグラウンドで実行されるプログラムとして PHP を使用します。 php を実行するには、php が mysql に接続してデータベース処理をループで実行する必要があります。

mysql 接続が中断されると、その後のループの実行は失敗します。

後続のプログラムが正常に実行できるように、mysql が切断されたときに自動的に再接続できるメソッドを設計する必要があります。

1. テストデータテーブルを作成します


2. テストデータを挿入します


3. バックグラウンドで実行される PHP ファイル4. 手順を実行します。


test.phpをphp cliモードで実行します, その後、すぐに mysql.server stop と mysql.server start を実行してフラッシュ中断をシミュレートします


CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ログイン後にコピー

フラッシュ中断後はデータベースに再接続できず、後続のプログラムが実行できないことがわかります。

insert into user(name) values('fdipzone'),('xfdipzone'),('terry');
mysql> select * from user;
+----+-----------+
| id | name |
+----+-----------+
| 1 | fdipzone |
| 2 | xfdipzone |
| 3 | terry |
+----+-----------+
ログイン後にコピー


5. 再接続メカニズムを追加

<?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;
}
}
?>
ログイン後にコピー


中断後は、self::$_instance の値が存在するため、get_conn を呼び出しても再接続されません。代わりに、保存された接続は処理に使用されます。

これは実際には、接続が存在する場合、mysql 接続を再度作成する必要がなく、mysql 接続の数が減少することを意味します。

そのため、作成されたものの失敗したデータベース接続を使用せずに次回接続を再取得できるように、中断後に self::$_instance の値をクリアする必要があります。 改善点は次のとおりです:

エラー発生時に呼び出されるreset_connectメソッドを追加します。 MySQL サーバーが消滅したと判断された場合は、既存のデータベース接続がクリアされ、次回からは MySQL に再接続されます。

変更されたphpファイルは次のとおりです:


db.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);
}
?>
ログイン後にコピー


6.フラッシュ実行後、現在実行されている効果が改善されたことがわかります。失敗しますが、新しい接続を再作成して実行を続行できます。

mysql.server stop
Shutting down MySQL
.. SUCCESS! 
mysql.server start
Starting MySQL
SUCCESS!
ログイン後にコピー
関連する推奨事項:


PHP が mysql データベースに接続した後に文字化けが発生する


PHP を mysql に接続する方法 - mysqli と PDO

以上がPHP が MySql に接続するときに自動的に再接続する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート