PDOMySQL実装クラス、無効な接続を自動的にリセット
10075 ワード
PHPがMySQLに接続する場合、MySQLのせいでphpで生成された接続が無効になる可能性があります.例えば8時間を超えると、MySQLが自動的に空き接続を切断する問題は、この時間を高くすることができますが、明らかにこれは比較的文芸的な実現方法ではありません.現在、洒家はPHPで接続が有効かどうかを検出し、無効な接続を再接続することでインテリジェント化しています.
直接コード:
直接コード:
php
/*
define('MYSQL_HOST','192.168.0.1');
define('MYSQL_USER','root');
define('MYSQL_PASSWD','123');
define('MYSQL_PORT','3306');
define('MYSQL_DBNAME','mysql');
define('MYSQL_CHARSET','utf8');
*/
/**
* PDOMySQL ,
* @author [email protected] lcs
*/
class PDOMySQL {
private $conn;
function __construct(){
$this->connect();
}
function connect(){
$cnt = 1;
// 3*10 10
while(!$this->conn){
try{
$this->conn = new PDO("mysql:dbname=".MYSQL_DBNAME.";host=".MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD);
// , exceptions 。 , ping
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo date('Y-m-d H:i:s')." PDOMySQL::connect PDOException ".$e->getMessage()."\r
";
$this->conn = null;
}
sleep(3);
if ($cnt++ > 10){
break;
}
}
return $this->conn;
}
public function query($sql){
$mixed = array();
$rest = null;
try{
$this->conn = $this->resetConnection();
if ( !$this->conn){
echo date('Y-m-d H:i:s')." PDOMySQL::query PDO_MYSQL connection is lost. "."\r
";
return $mixed;
}
$rest = $this->conn->query($sql, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo date('Y-m-d H:i:s')." PDOMySQL::query PDOException ".$e->getMessage()."\r
";
$rest = null;
}
if ( $rest ) {
foreach($rest as $row){
$mixed[] = $row;
}
}
return $mixed;
}
/**
*
*/
function resetConnection(){
// echo "resetConnection "."\r
";
$res = $this->ping();
if (!$res){
$this->conn = $this->connect();
}
return $this->conn;
}
/**
* connection
*/
function ping(){
if ($this->conn) {
try{
$res = $this->conn->getAttribute(PDO::ATTR_SERVER_INFO);
// echo $res."\r
";
} catch (PDOException $e) {
echo date('Y-m-d H:i:s')." PDOMySQL::ping PDOException ".$e->getMessage()."\r
";
if(strpos($e->getMessage(), 'server has gone away')!==false){
$this->conn = null;
return false;
}
}
return true;
}else{
echo date('Y-m-d H:i:s')." PDOMySQL::ping PDO_MYSQL connection is lost. "."\r
";
}
return false;
}
}
// ...