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实现类, 自动重置无效连接的更多相关文章

  1. PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

  2. ThinkPHP 自动验证与自动填充无效可能的原因(转)

    自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() Think ...

  3. ThinkPHP 自动验证与自动填充无效可能的原因

    原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...

  4. 客户端无法重新使用 SPID 为 63 的会话,该会话已被重置用于连接

    客户端无法重新使用 SPID 为 %d 的会话,该会话已被重置用于连接池.失败 ID 为 %d. 此错误可能是由于先前的操作失败引起的.请查看错误日志,找出在显示此错误消息之前刚发生的失败操作. 20 ...

  5. 解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题

    解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题 最近有个问题非常讨厌,我们的工程中使用自己的连接池连接mysql数据库,可mysql数据库每隔8小时就会自动断开所有链接, ...

  6. <转>thinkphp自动验证无效的问题

    新手入门thinkphp,试用自动验证表单输入数据功能,却发现怎么都不能调用自动验证,自动验证无效,原因竟是一个小细节的疏忽,学习一定要细心啊! Action方法: IndexAction下的adds ...

  7. Android Studio 代码自动提示无效

    Android Studio代码自动提示无效(not available in Power Save mode)的解决办法 问题描述: 今天用Android studio敲代码,突然间就没有代码提示了 ...

  8. 让普通 Java 类自动感知 Activity Lifecycle

    背景 在 Android 开发中,我们都很熟悉 Activity 的 Lifecycle,并且会在特定的 Lifecycle 下执行特定的操作.当然,我们清楚 Lifecycle 本身是带有 Andr ...

  9. mysql自动断开该连接解决方案

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案 作者: MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断 ...

随机推荐

  1. GridView用法

    首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...

  2. CMOS门电路

    参考:https://wenku.baidu.com/view/8582501e964bcf84b9d57bd3.html 1.    CMOS与非门(P并N串) 2.    CMOS或非门(N并P串 ...

  3. Verify_Execute 验证SQL语句执行结果

    #region Verify_Execute /// <summary> /// 验证insert.update.delete执行 /// </summary> /// < ...

  4. RPC REST 比较

    REST 和 RPC是两种架构设计风格. 一般情况下REST多用于与外部接口访问时的设计,RPC多用于系统内部的. 为什么这样呢? 1.RPC必然有依赖,REST必然没有,不要抬杠,SDK暂时不算. ...

  5. JavaScript--图片放大镜

    图片放大镜的原理: 两张相同的图片img1和img2,img1上有一个#dd的div,通过鼠标移动dd,根据dd区域内的图片,来裁剪img2的图片,并将img2的图片放大,显示出来 关键词:img1坐 ...

  6. Linux学习资料整理

    Linux sshd服务自动启动 Ubuntu 各版本代号简介 CentOS 7 FTP安装与配置 vsftpd配置文件讲解 linux中的selinux到底是什么 CentOS7 部署Apache服 ...

  7. Spring Cloud Zuul 中文文件上传乱码

    原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...

  8. CentOS7操作Redis4.0

    单机安装 1. 从官网下载 redis-4.0.10.tar.gz 到本地,然后上传到VMware虚拟机上,存放地址随意. 2. 解压: tar -zxvf redis-4.0.10.tar.gz 3 ...

  9. MTK 使用iptable 命令来完成网络路由(android WIFI/4G分享网络)

    很多时候,总有些奇怪的需求,这时候是发挥我们的聪明才智的时候!! 有客户的需求是: 公网 WIFI 4G/其他网络 以太网1 以太网2 内部设备 描述下需求:现今有一个控制设备,里面有WIFI,物联网 ...

  10. Linux下使用acme.sh 配置https 免费证书

    acme.sh 简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书.acme.sh 有以下特点:一个纯粹用Shell(Unix shell)语言编写的 ...