PDOMySQL實現類, 自動重置無效連接

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\n";
              $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\n";
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\n"; $rest = null; } if ( $rest ) { foreach($rest as $row){ $mixed[] = $row; } } return $mixed; } /** * 重置連接 */ function resetConnection(){ // echo "resetConnection "."\r\n"; $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\n"; } catch (PDOException $e) { echo date('Y-m-d H:i:s')." PDOMySQL::ping PDOException ".$e->getMessage()."\r\n"; 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\n"; } return false; } } // ...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章