当前位置:Gxlcms > PHP教程 > php PDO判断连接是否可用的实现方法

php PDO判断连接是否可用的实现方法

时间:2021-07-01 10:21:17 帮助过:61人阅读

mysql_ping() 检查到服务器的连接是否正常。如果到服务器的连接可用,则返回true,否则返回false。

但PDO不支持mysql_ping()方法,因此需要自己编写代码模拟mysql_ping()方法,检查连接是否可用。

代码如下:

  1. <?php
  2. /**
  3. * 检查连接是否可用
  4. * @param Link $dbconn 数据库连接
  5. * @return Boolean
  6. */
  7. function pdo_ping($dbconn){
  8. try{
  9. $dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
  10. } catch (PDOException $e) {
  11. if(strpos($e->getMessage(), 'MySQL server has gone away')!==false){
  12. return false;
  13. }
  14. }
  15. return true;
  16. }
  17. ?>

代码演示:

1、创建测试数据表

  1. CREATE TABLE `user` (
  2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、插入测试数据

  1. insert into user(name) values('fdipzone'),('xfdipzone'),('terry');
  2. mysql> select * from user;
  3. +----+-----------+
  4. | id | name |
  5. +----+-----------+
  6. | 1 | fdipzone |
  7. | 2 | xfdipzone |
  8. | 3 | terry |
  9. +----+-----------+

3、演示文件

db.php

  1. <?php
  2. // 数据库操作类
  3. class DB{
  4. // 保存数据库连接
  5. private static $_instance = null;
  6. // 连接数据库
  7. public static function get_conn($config){
  8. if(isset(self::$_instance) && !empty(self::$_instance)){
  9. return self::$_instance;
  10. }
  11. $dbhost = $config['host'];
  12. $dbname = $config['dbname'];
  13. $dbuser = $config['user'];
  14. $dbpasswd = $config['password'];
  15. $pconnect = $config['pconnect'];
  16. $charset = $config['charset'];
  17. $dsn = "mysql:host=$dbhost;dbname=$dbname;";
  18. try {
  19. $h_param = array(
  20. PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  21. );
  22. if ($charset != '') {
  23. $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $charset; //設置默認編碼
  24. }
  25. if ($pconnect) {
  26. $h_param[PDO::ATTR_PERSISTENT] = true;
  27. }
  28. $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);
  29. } catch (PDOException $e) {
  30. throw new ErrorException('Unable to connect to db server. Error:' . $e->getMessage(), 31);
  31. }
  32. self::$_instance = $conn;
  33. return $conn;
  34. }
  35. // 执行查询
  36. public static function query($dbconn, $sqlstr, $condparam){
  37. $sth = $dbconn->prepare($sqlstr);
  38. try{
  39. $sth->execute($condparam);
  40. } catch (PDOException $e) {
  41. echo $e->getMessage().PHP_EOL;
  42. }
  43. $result = $sth->fetchAll(PDO::FETCH_ASSOC);
  44. return $result;
  45. }
  46. // 重置连接
  47. public static function reset_connect(){
  48. self::$_instance = null;
  49. }
  50. }
  51. ?>

test.php

  1. <?php
  2. require 'db.php';
  3. // 数据库设定
  4. $config = array(
  5. 'host' => 'localhost',
  6. 'dbname' => 'user',
  7. 'user' => 'root',
  8. 'password' => '',
  9. 'pconnect' => 0,
  10. 'charset' => ''
  11. );
  12. // 循环执行
  13. while(true){
  14. // 创建数据连接
  15. $dbconn = DB::get_conn($config);
  16. // 判断连接是否有效
  17. $status = pdo_ping($dbconn);
  18. if($status){
  19. echo 'connect ok'.PHP_EOL;
  20. }else{
  21. echo 'connect failure'.PHP_EOL;
  22. // 重置连接
  23. DB::reset_connect();
  24. $dbconn = DB::get_conn($config);
  25. }
  26. // 执行查询
  27. $sqlstr = 'select * from user where id=?';
  28. $condparam = array(mt_rand(1,3));
  29. $data = DB::query($dbconn, $sqlstr, $condparam);
  30. print_r($data);
  31. // 延时10秒
  32. echo 'sleep 10'.PHP_EOL.PHP_EOL;
  33. sleep(10);
  34. }
  35. /**
  36. * 检查连接是否可用
  37. * @param Link $dbconn 数据库连接
  38. * @return Boolean
  39. */
  40. function pdo_ping($dbconn){
  41. try{
  42. $dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
  43. } catch (PDOException $e) {
  44. if(strpos($e->getMessage(), 'MySQL server has gone away')!==false){
  45. return false;
  46. }
  47. }
  48. return true;
  49. }
  50. ?>

4、执行

在php cli模式下执行test.php,然后马上执行mysql.server stop 与 mysql.server start 模拟闪断

  1. mysql.server stop
  2. Shutting down MySQL
  3. .... SUCCESS!
  4. mysql.server start
  5. Starting MySQL
  6. SUCCESS!

执行输出:

  1. connect ok
  2. Array
  3. (
  4. [0] => Array
  5. (
  6. [id] => 2
  7. [name] => xfdipzone
  8. )
  9. )
  10. sleep 10
  11. connect failure
  12. Array
  13. (
  14. [0] => Array
  15. (
  16. [id] => 3
  17. [name] => terry
  18. )
  19. )
  20. sleep 10
  21. connect ok
  22. Array
  23. (
  24. [0] => Array
  25. (
  26. [id] => 3
  27. [name] => terry
  28. )
  29. )
  30. sleep 10

可以看到闪断后,pdo_ping()返回false,连接失败,然后调用自动重连,保证后面的查询能继续执行。

以上这篇php PDO判断连接是否可用的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

人气教程排行