加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[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数组里的时间戳也进行了续期.
每次执行操作都会从cache数组中获取下连接,多次执行不超过10秒的情况下,只会有一个连接

代码中实现读写分离,判断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);

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读