标签:mysql 主从分离
<?php /** * gMysql MySQL数据库的驱动支持 */ class gMysql { /** * 数据库链接句柄 */ public $conn;// 当前使用的连接 /** * 执行的SQL语句记录 */ public $arrSql; // 当前连接ID public $m_link_id = null; // 主库连接 public $s_link_id = null; // 从库连接 // 是否多库 public $multi_server = false; // 数据库连接参数配置 public $dbConfig = array (); public $dbCurrent = array (); /** * 构造函数 * * @param dbConfig 数据库配置 */ public function __construct($dbConfig) { $this->dbConfig = $dbConfig; $this->multi_server = empty ( $this->dbConfig[‘slave‘] ) ? false : true; } /** * 连接数据库方法 * @param type $dbConfig */ public function connect ($db) { $this->dbCurrent = $db; $linkfunction = ( TRUE == $db[‘persistent‘] ) ? ‘mysql_pconnect‘ : ‘mysql_connect‘; $this->conn = $linkfunction ( $db [‘host‘], $db [‘username‘], $db [‘password‘]); if (! $this->conn) { return false; } $re = mysql_select_db($db[‘dbname‘], $this->conn); if(!$re) { return false; } mysql_query ( "SET NAMES ‘" . $db [‘charset‘] . "‘", $this->conn ); } /** * 初始化数据库连接 * @param type $master */ public function initConnect ($master = true) { if ($master || !$this->multi_server) { if($this->m_link_id){ $this->conn = $this->m_link_id; $this->ping($master); } else { $this->connect ( $this->dbConfig [‘master‘] ); $this->m_link_id = $this->conn; } } else { if($this->s_link_id){ $this->conn = $this->s_link_id; $this->ping($master); } else { $rand = rand(0, count($this->dbConfig [‘slave‘]) - 1); $this->connect ( $this->dbConfig [‘slave‘][$rand] ); $this->s_link_id = $this->conn; } } } /** * 按SQL语句获取记录结果,返回数组 * * @param sql 执行的SQL语句 */ public function getArray($sql) { if( ! $result = $this->query($sql) )return FALSE; if( ! mysql_num_rows($result) ) return FALSE; $rows = array(); while($rows[] = mysql_fetch_array($result,MYSQL_ASSOC)){} mysql_free_result($result); array_pop($rows); return $rows; } /** * 返回当前插入记录的主键ID */ public function newinsertid() { return mysql_insert_id($this->conn); } /** * 格式化带limit的SQL语句 */ public function setlimit($sql, $limit) { return $sql. " LIMIT {$limit}"; } /** * 执行一个SQL语句 * * @param sql 需要执行的SQL语句 */ public function exec($sql) { $this->arrSql[] = $sql; $this->initConnect ( true ); return mysql_query($sql, $this->conn); } /** * 执行一个SQL语句,主要用于查询 * @param type $sql * @param type $master default:false 为true:强制读主库;为false:在有从库的的情况下优先读从库,否则读主库 */ public function query ($sql, $master = false) { $this->arrSql[] = $sql; $this->initConnect ( $master ); return mysql_query($sql, $this->conn); } /** * 返回影响行数 */ public function affected_rows() { return mysql_affected_rows($this->conn); } /** * 获取数据表结构 * * @param tbl_name 表名称 */ public function getTable($tbl_name) { return $this->getArray("DESCRIBE {$tbl_name}"); } //防止mysql gone away public function ping($master) { if(!@mysql_ping($this->conn)){ @mysql_close($this->conn); //注意:一定要先执行数据库关闭,这是关键 if($master || !$this->multi_server) { unset($this->m_link_id); } else { unset($this->s_link_id); } $this->initConnect($master); } } /** * 对特殊字符进行过滤 * * @param value 值 */ public function __val_escape($value) { if(is_null($value))return ‘NULL‘; if(is_bool($value))return $value ? 1 : 0; if(is_int($value))return (int)$value; if(is_float($value))return (float)$value; if(@get_magic_quotes_gpc())$value = stripslashes($value); $this->conn || $this->initConnect(); return ‘\‘‘.mysql_real_escape_string($value, $this->conn).‘\‘‘; } public function escape($value) { if(is_null($value))return ‘NULL‘; if(is_bool($value))return $value ? 1 : 0; if(is_int($value))return (int)$value; if(is_float($value))return (float)$value; if(@get_magic_quotes_gpc())$value = stripslashes($value); $this->conn || $this->initConnect(); return mysql_real_escape_string($value, $this->conn); } /** * 析构函数 */ public function __destruct() { if( TRUE != @$this->dbCurrent[‘persistent‘] )@mysql_close($this->conn); } }
重点在 initConnect($master)方法里,这里决定加载的配置文件中是连接到主库还是从库
标签:mysql 主从分离
原文地址:http://chenxiaolong.blog.51cto.com/8786841/1828506