PHP、Python 长连接 MySQL数据库
场景描述一个常驻内存的脚本,需要时刻向数据库插入数据,并能在服务端重启后完成自动重连。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形式
未完待续
实际截图
是否使用单例模式的差异:
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~