PHP連線MySql閃斷自動重連的方法

2021-08-31 13:19:47 字數 3971 閱讀 9171

使用php作為後台執行程式(例如簡訊**),在cli模式下執行php,php需要連線mysql迴圈執行資料庫處理。

當mysql連線閃斷時,之後迴圈的執行將會失敗。

我們需要設計乙個方法,當mysql閃斷時,可以自動重新連線,使後面的程式可以正常執行下去。

1.建立測試資料表

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.插入測試資料

insert into user(name) values('fdipzone'),('xfdipzone'),('terry');

mysql> select * from user;

+----+-----------+

| id | name |

+----+-----------+

| 1 | fdipzone |

| 2 | xfdipzone |

| 3 | terry |

+----+-----------+

3.後台執行的php檔案

db.php

<?php

// 資料庫操作類

class db

$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

if ($pconnect)

$conn = new pdo($dsn, $dbuser, $dbpasswd, $h_param);

} catch (pdoexception $e)

self::$_instance = $conn;

return $conn;

}// 執行查詢

public static function query($dbconn, $sqlstr, $condparam) catch (pdoexception $e)

$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)

?>

4.執行步驟

在php cli模式下執行test.php,然後馬上執行mysql.server stop 與 mysql.server start 模擬閃斷

mysql.server stop

shutting down mysql

.. success!

mysql.server start

starting mysql

success!

可以看到,閃斷後不能重新連線資料庫,後面的程式不能執行下去。

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.增加重連機制

if(isset(self::$_instance) && !empty(self::$_instance))
閃斷後,因為 self::$_instance 的值存在,因此呼叫get_conn並不會重新連線,而是使用儲存的連線進行處理。

這樣實際上是當連線存在時,不需要再次建立mysql連線,減少mysql連線數。

所以需要在閃斷後,清空self::$_instance的值,使下次重新獲取連線,而不使用已經建立但失效的資料庫連線。

改進方法如下:

增加reset_connect方法,當出現錯誤時呼叫。如果判斷錯誤是mysql server has gone away則清空已經存在的資料庫連線,清空後下次則會重新連線mysql。

修改後的php檔案如下:

db.php

<?php

// 資料庫操作類

class db

$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

if ($pconnect)

$conn = new pdo($dsn, $dbuser, $dbpasswd, $h_param);

} catch (pdoexception $e)

self::$_instance = $conn;

return $conn;

}// 執行查詢

public static function query($dbconn, $sqlstr, $condparam) catch (pdoexception $e)

$result = $sth->fetchall(pdo::fetch_assoc);

return $result;

}// 重置連線

public static function reset_connect($err_msg)}}

?>

6.再次進行閃斷執行

可以看到改進後的效果,閃斷後,當前執行的會失敗,但之後的可以重新建立新連線繼續執行下去。

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

...

sftp配置導致ssh連線閃斷

實現 因為sftp是ssh服務自帶的功能,所以去修改ssh的配置檔案sshd config。1cd etc ssh 2cp sshd config sshd config.bak 3vim sshd config 4 注釋該行 5 subsystem sftp usr libexec openssh...

Python 實現斷網自動重連

來所裡一年了,終於有了一台電腦,是小樂師兄淘汰給我的,很開心,因為用它程式設計智商有加成。但是問題就來了,我平時人在懷柔啊,怎麼才能用所裡的電腦搞科研呢?遠端自然是很簡單的,但是所裡每天晚上三天鍾會可恥地斷一次網,而且斷網必須要登入才能重連,為了不麻煩師兄,同時也讓我週末回來顯得很忙的樣子,我開始鼓...

mysql 自動連線 mysql 自連線

自連線 自連線是一種特殊的表連線,它是指相互連線的表在物理上同為一張表,但是邏輯上是多張表。自連線通常用於表中的資料有層次結構,如區域表 選單表 商品分類表等。自連線語法 select a.column,b.column from table a,table b where a.column b.c...