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