使用php作為後台執行程式(例如簡訊**),在cli模式下執行php,php需要連線mysql迴圈執行資料庫處理。
當mysql連線閃斷時,之後迴圈的執行將會失敗。
我們需要設計乙個方法,當mysql閃斷時,可以自動重新連線,使後面的程式可以正常執行下去。
1.建立測試資料表
create table `user` (2.插入測試資料`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');3.後台執行的php檔案mysql> select * from user;
+----+-----------+
| id | name |
+----+-----------+
| 1 | fdipzone |
| 2 | xfdipzone |
| 3 | terry |
+----+-----------+
db.php
<?phptest.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;}}
?>
<?php4.執行步驟require 'db.php';
// 資料庫設定
$config = array(
'host' => 'localhost',
'dbname' => 'user',
'user' => 'root',
'password' => '',
'pconnect' => 0,
'charset' => ''
);// 迴圈執行
while(true)
?>
在php cli模式下執行test.php,然後馬上執行mysql.server stop 與 mysql.server start 模擬閃斷
mysql.server stop可以看到,閃斷後不能重新連線資料庫,後面的程式不能執行下去。shutting down mysql
.. success!
mysql.server start
starting mysql
success!
array5.增加重連機制([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
...
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
<?php6.再次進行閃斷執行// 資料庫操作類
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)}}
?>
可以看到改進後的效果,閃斷後,當前執行的會失敗,但之後的可以重新建立新連線繼續執行下去。
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...