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; } } // ...