[PHP] PHP PDO与mysql的连接单例防止超时情况处理
发布时间:2021-05-21 06:53:14 所属栏目:大数据 来源: https://www.jb51.cc
导读:这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较,如果间隔超过了10秒就再次new PDO创建连接,没有超过的情况
这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较,如果间隔超过了10秒就再次new PDO创建连接,没有超过的情况下会继续使用原来的连接,并且因为每次使用后会使连接续期,cache数组里的时间戳也进行了续期. 代码中实现读写分离,判断sql语句前面6个字符是select的就查询从库,其余操作查询主库.主库和从库就是分别在配置数组中0和1创建不同的PDO对象连接 代码如下: <?PHP class SinaPdoAdapter{ const MASTER = 0; const SLAVE = 1const DEFAULT_CACHE_EXPIRETIME = 10private static $options = array( PDO::ATTR_AUTOCOMMIT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,1)"> PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,1)">//PDO::ATTR_PERSISTENT => true, ); private $dsn = null$username = $password = $timeout = $charset = $conns = (); $conn = $stmt = $obj=function __construct($dsn,$username,1)">$password,1)">null,1)">){ $this->dsn = $dsn; if (!is_array($username)) { $this->username = array(); } else { $this->username = ; } $password$this->password = $this->password = ; } $this->timeout = intval($timeout); $this->charset = $charset; } function getConnection($id = self::MASTER){ isset($this->dsn[$id])) { MASTER; } $conn = $this->getCachedConn(); if ($conn) { return $opts = self::$options$this->timeout > 0) { $opts[PDO::ATTR_TIMEOUT] = $this->timeout; } $this->username[$id]) ? $id] : $this->username[self::MASTER]; $this->password[$this->password[self::new PDO($id],1)">$opts$this->cacheConn($id,1)">charset) { $conn->exec('set names ' . charset); } ; } public function execute($sql,1)">$params = ()){ $cmd = substr(if (strcasecmp($cmd,'select') === 0$this->getConnection(self::SLAVE); } MASTER); } $stmt = $conn->prepare($sql$stmt->execute($params$this->stmt = $stmt; $this->conn = function fetch(){ $this->stmt->fetch(); } fetchAll(){ fetchAll(); } lastInsertId(){ $this->conn->lastInsertId(); } rowCount(){ rowCount(); } static function getInstance($conf){ if(self::$obj == ){ self::$obj = new self($conf->dsn,1)">$conf->username,1)">$conf->password,1)">$conf->timeout,1)">$conf->return self::$objfunction getCachedConn($this->conns[])) { return list($conn,1)">$timeout) = ]; time() < ); ; } { ; } } function cacheConn(time(); timeout) { $timeout += timeout; } $timeout += self::DEFAULT_CACHE_EXPIRETIME; } $id] = ); } } $config=new stdClass(); $config->dsn=( "MysqL:host=127.0.0.1;port=3306;dbname=surframe",1)">主库 "MysqL:host=127.0.0.2;port=3306;dbname=surframe"从库 ); $config->username=( 'root','root',1)"> ); $config->password=( 'taoshihan1','taoshihan1',1)">$config->timeout=10; $config->charset="utf8"; $db=SinaPdoAdapter::getInstance($config$db->execute("select * from admin_users");使用的从库 $rows=$db->fetchAll(); var_dump($db); $db); ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |