PDO ping 的实例 ,解决mysql has gone的问题

项目中遇到了  mysql has gone的情况 , 因为这个脚本是一直开启的状态,不会自己断掉, so 需要在每次查询前 检测链接是不是正常的操作;

公司的Api 这部分是没有封装成类的 图省事  也没有封住成类 (下面会讲到类的怎么操作)


PDO 生成的时候最好还是加上两个选项

$option = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 有错误的时候 抛出错误
    PDO::ATTR_PERSISTENT => true    // 长链接
];

<?php

/**
 * gen PDO instance
 * @return PDO
 */
function getPdo()
{
    static $pdo;

    try {
        if (!$pdo) {
            $pdo = pdoInit();
        }

        // check pdo link
        $pdo = pingPdo($pdo);

        if (!is_object($pdo)) {
            throw new \PDOException('reconnect mysql failed');
        }

    } catch (\PDOException  $e) {
        error_log($e->getMessage(), 3, ERROR_LOG);
        trigger_error($e->getMessage(), E_USER_ERROR);
    }

    return $pdo;
}

// ping pdo
function pingPdo($pdo)
{

    try {

        if (!is_object($pdo) || !method_exists($pdo, 'query')) {

            throw new \PDOException('mysql has gone');
        }

        // just do it
        $pdo->query('do 1');

    } catch (\PDOException $e) {

        // init pdo
        $pdo = pdoInit();
    }

    return $pdo;
}

// init pdo
function pdoInit()
{

    $config = get_config('db');

    $pdo = null;
    $i = 0;
    while ($i < 3 && !$pdo) {
        try {

            $pdo = new PDO($config['dsn'], $config['usr'], $config['pwd']);

        } catch (\PDOException $e) {
            $i++;
        }
    }

    return $pdo;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值