PDOMySQL实现类, 自动重置无效连接
PHP连接MySQL时, 有可能因为MySQL的原因,而使得php里生成的连接无效。比如超过8小时, MySQL自动断开空闲连接的问题,虽然可以调高这个时间,但显然这不是比较文艺的实现方式。现在洒家用PHP检测连接是否有效的方法,然后再重新连接无效的连接,这样就比较智能化了。
直接上代码:
<?php /*
define('MYSQL_HOST','192.168.0.1');
define('MYSQL_USER','root');
define('MYSQL_PASSWD','123');
define('MYSQL_PORT','3306');
define('MYSQL_DBNAME','mysql');
define('MYSQL_CHARSET','utf8');
*/
/**
* PDOMySQL实现类, 自动重置无效连接
* @author 1125271180@qq.com lcs
*/
class PDOMySQL { private $conn; function __construct(){
$this->connect();
} function connect(){
$cnt = 1;
// 在3*10秒内尝试连接10次
while(!$this->conn){
try{
$this->conn = new PDO("mysql:dbname=".MYSQL_DBNAME.";host=".MYSQL_HOST, MYSQL_USER, MYSQL_PASSWD);
// 错误报告,抛出 exceptions 异常。这里要设置,要不然ping函数不起作用
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo date('Y-m-d H:i:s')." PDOMySQL::connect PDOException ".$e->getMessage()."\r\n";
$this->conn = null;
}
sleep(3);
if ($cnt++ > 10){
break;
}
}
return $this->conn;
} public function query($sql){
$mixed = array();
$rest = null;
try{
$this->conn = $this->resetConnection();
if ( !$this->conn){
echo date('Y-m-d H:i:s')." PDOMySQL::query PDO_MYSQL connection is lost. "."\r\n";
return $mixed;
}
$rest = $this->conn->query($sql, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo date('Y-m-d H:i:s')." PDOMySQL::query PDOException ".$e->getMessage()."\r\n";
$rest = null;
}
if ( $rest ) {
foreach($rest as $row){
$mixed[] = $row;
}
} return $mixed;
} /**
* 重置连接
*/
function resetConnection(){
// echo "resetConnection "."\r\n";
$res = $this->ping();
if (!$res){
$this->conn = $this->connect();
}
return $this->conn;
} /**
*检查connection是否有效
*/
function ping(){
if ($this->conn) {
try{
$res = $this->conn->getAttribute(PDO::ATTR_SERVER_INFO);
// echo $res."\r\n";
} catch (PDOException $e) {
echo date('Y-m-d H:i:s')." PDOMySQL::ping PDOException ".$e->getMessage()."\r\n";
if(strpos($e->getMessage(), 'server has gone away')!==false){
$this->conn = null;
return false;
}
}
return true; }else{
echo date('Y-m-d H:i:s')." PDOMySQL::ping PDO_MYSQL connection is lost. "."\r\n";
}
return false;
}
} // ...
PDOMySQL实现类, 自动重置无效连接的更多相关文章
- PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置
一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...
- ThinkPHP 自动验证与自动填充无效可能的原因(转)
自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() Think ...
- ThinkPHP 自动验证与自动填充无效可能的原因
原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...
- 客户端无法重新使用 SPID 为 63 的会话,该会话已被重置用于连接
客户端无法重新使用 SPID 为 %d 的会话,该会话已被重置用于连接池.失败 ID 为 %d. 此错误可能是由于先前的操作失败引起的.请查看错误日志,找出在显示此错误消息之前刚发生的失败操作. 20 ...
- 解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题
解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题 最近有个问题非常讨厌,我们的工程中使用自己的连接池连接mysql数据库,可mysql数据库每隔8小时就会自动断开所有链接, ...
- <转>thinkphp自动验证无效的问题
新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...
- Android Studio 代码自动提示无效
Android Studio代码自动提示无效(not available in Power Save mode)的解决办法 问题描述: 今天用Android studio敲代码,突然间就没有代码提示了 ...
- 让普通 Java 类自动感知 Activity Lifecycle
背景 在 Android 开发中,我们都很熟悉 Activity 的 Lifecycle,并且会在特定的 Lifecycle 下执行特定的操作.当然,我们清楚 Lifecycle 本身是带有 Andr ...
- mysql自动断开该连接解决方案
mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 作者: MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断 ...
随机推荐
- WinForm中 Asp.Net Signalr消息推送测试实例
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- SuperSocket基础二
SuperSocket基础(二)-----一个完整的SocketServer项目 由于时间关系未能及时更新,关于SuperSocket,对于初学者而言,一个SuperSock的Server真的不好写. ...
- 文件下载后台报错IllegalStateException: getOutputStream() has already been called
java.lang.IllegalStateException: getOutputStream() has already been called <%@page language=" ...
- ubuntu+anaconda+mxnet环境配置
为了insightface和mxnet较劲的一天 mxnet环境: 官网下载pyhton2.7版本的anaconda,随便找个安装教程 sh Anacondaxxxx.sh #一路默认即可,第二个回车 ...
- Linux基础命令---dmeg显示内核输出
dmesg dmesg指令用来打印和控制内核的输出信息,这些信息保存早ring buffer中. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora.SUSE.open ...
- linux find命令中-print0和xargs中-0的用法
linux find命令中-print0和xargs中-0的用法. 1.默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此find 的输出都是一行一行的: ...
- 并查集 P3367 【模板】并查集
P3367 [模板]并查集 #include<iostream> #include<algorithm> #include<cstdio> #include< ...
- Android中本地广播的实现
其实Android的本地广播并没有什么好讲的,他就是用了一个localbroadcastmanager类来sendbroadcast,以及注册和注销广播,没有什么特点,其中实例该类的时候用了getin ...
- python 字典操作提取key,value
python 字典操作提取key,value dictionaryName[key] = value 1.为字典增加一项 2.访问字典中的值 3.删除字典中的一项 4.遍历字典 5.字典遍历的 ...
- mpvue小程序开发tips(1)
wx.setStorageSync('vipId',vipId)-----存储 wx.getStorageSync('vipId')-------读取 wx.navigateTo({ url: ...