云迈博客

您现在的位置是:首页 > 后端开发 > 正文

后端开发

PHP、Python 长连接 MySQL数据库

wsinbol2021-07-11后端开发520
场景描述一个常驻内存的脚本,需要时刻向数据库插入数据,并能在服务端重启后完成自动重连。PHP之PDO方式新建DB类```PDO::ERRMODE_EXCEPTION,);

场景描述

一个常驻内存的脚本,需要时刻向数据库插入数据,并能在服务端重启后完成自动重连。

PHP之PDO方式

新建DB类

<?php
// 数据库操作类
class DB{

    // 保存数据库连接
    private static $_instance = null;

    // 连接数据库
    public static function get_conn($config){

        if(isset(self::$_instance) && !empty(self::$_instance)){

            return self::$_instance;
        }

        $dbhost = $config['host'];
        $dbname = $config['dbname'];
        $dbuser = $config['user'];
        $dbpasswd = $config['password'];
        $pconnect = $config['pconnect'];
        $charset = $config['charset'];

        $dsn = "mysql:host=$dbhost;dbname=$dbname;";
        try {
            $h_param = array(
                    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            );
            if ($charset != '') {
                $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset;
            }
            if ($pconnect) {
                $h_param[PDO::ATTR_PERSISTENT] = true;
            }

            $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

        } catch (PDOException $e) {
            return false;
            // throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
        }

        self::$_instance = $conn;
        return $conn;
    }

    // 执行查询
    public static function query($dbconn, $sqlstr, $condparam){
        $sth = $dbconn->prepare($sqlstr);
        try{
            $sth->execute($condparam);
        } catch (PDOException $e) {
            echo $e->getMessage().PHP_EOL;
        }
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    // 执行插入
    public static function insert($dbconn, $sqlstr, $condparam){

        $sth = $dbconn->prepare($sqlstr);
        try{
            $sth->execute($condparam);
        } catch (PDOException $e) {
            echo $e->getMessage().PHP_EOL;
        }
        return $result;
    }

    // 重置连接
    public static function reset_connect(){
        self::$_instance = null;
    }

}
?>

实际应用

<?php

require_once './db.php';

ini_set('default_socket_timeout',-1);

$config = array(
    'host' => '127.0.0.1',
    'dbname' => 'fa_alarm',
    'user' => 'root',
    'password' => 'rootroot',
    'pconnect' => 0,
    'charset' => ''
);

function pdo_ping($dbconn){
    try{
        $dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
    } catch (PDOException $e) {
        if(strpos($e->getMessage(), 'MySQL server has gone away')!==false){
            return false;
        }
    }
    return true;
}

while(true){
    $dbconn = DB::get_conn($config);
    if($dbconn == false){
        $dbconn = DB::get_conn($config);
        continue;
    }

    $status = pdo_ping($dbconn);

    if($status){
        echo 'connect ok'.PHP_EOL;
    }else{
        echo 'connect failure'.PHP_EOL;
        // 重置连接
        DB::reset_connect();
        $dbconn = DB::get_conn($config);

        if($dbconn == false){
            $dbconn = DB::get_conn($config);
            continue;
        }
    }

    $sqlstr = "INSERT INTO fa_alarm(ID,PORT,REMINDER,CREATETIME,TYPE) VALUES(NULL,:port,1,:timeat,:type)";

    $condparam = array(':timeat'=>date('Y-m-d H:i:s'),':port'=>'A0', ':type' => 0);

    DB::insert($dbconn,$sqlstr,$condparam);

    sleep(2);
}

Python之pymysql形式

未完待续

实际截图

是否使用单例模式的差异:

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~