cari
Rumahpembangunan bahagian belakangtutorial phpphp PDO实现判断连接是否可用的方法

本篇文章主要介绍php PDO实现判断连接是否可用的方法,感兴趣的朋友参考下,希望对大家有所帮助。

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

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

代码如下:

<?php
/**
 * 检查连接是否可用
 * @param Link $dbconn 数据库连接
 * @return Boolean
 */
function pdo_ping($dbconn){
  try{
    $dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
  } catch (PDOException $e) {
    if(strpos($e->getMessage(), &#39;MySQL server has gone away&#39;)!==false){
      return false;
    }
  }
  return true;
}
?>

代码演示:

1、创建测试数据表

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


2、插入测试数据

insert into user(name) values(&#39;fdipzone&#39;),(&#39;xfdipzone&#39;),(&#39;terry&#39;);

mysql> select * from user;
+----+-----------+
| id | name   |
+----+-----------+
| 1 | fdipzone |
| 2 | xfdipzone |
| 3 | terry   |
+----+-----------+


3、演示文件

db.php

<?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[&#39;host&#39;];
    $dbname = $config[&#39;dbname&#39;];
    $dbuser = $config[&#39;user&#39;];
    $dbpasswd = $config[&#39;password&#39;];
    $pconnect = $config[&#39;pconnect&#39;];
    $charset = $config[&#39;charset&#39;];

    $dsn = "mysql:host=$dbhost;dbname=$dbname;";
    try {
      $h_param = array(
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      );
      if ($charset != &#39;&#39;) {
        $h_param[PDO::MYSQL_ATTR_INIT_COMMAND] = &#39;SET NAMES &#39; . $charset; //設置默認編碼
      }
      if ($pconnect) {
        $h_param[PDO::ATTR_PERSISTENT] = true;
      }
      $conn = new PDO($dsn, $dbuser, $dbpasswd, $h_param);

    } catch (PDOException $e) {
      throw new ErrorException(&#39;Unable to connect to db server. Error:&#39; . $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 reset_connect(){
    self::$_instance = null;
  }

}
?>

test.php

<?php
require &#39;db.php&#39;;

// 数据库设定
$config = array(
  &#39;host&#39; => &#39;localhost&#39;,
  &#39;dbname&#39; => &#39;user&#39;,
  &#39;user&#39; => &#39;root&#39;,
  &#39;password&#39; => &#39;&#39;,
  &#39;pconnect&#39; => 0,
  &#39;charset&#39; => &#39;&#39;
);

// 循环执行
while(true){

  // 创建数据连接
  $dbconn = DB::get_conn($config);

  // 判断连接是否有效
  $status = pdo_ping($dbconn);

  if($status){
    echo &#39;connect ok&#39;.PHP_EOL;
  }else{
    echo &#39;connect failure&#39;.PHP_EOL;

    // 重置连接
    DB::reset_connect();
    $dbconn = DB::get_conn($config);
  }

  // 执行查询
  $sqlstr = &#39;select * from user where id=?&#39;;
  $condparam = array(mt_rand(1,3));
  $data = DB::query($dbconn, $sqlstr, $condparam);
  print_r($data);

  // 延时10秒
  echo &#39;sleep 10&#39;.PHP_EOL.PHP_EOL;
  sleep(10);

}

/**
 * 检查连接是否可用
 * @param Link $dbconn 数据库连接
 * @return Boolean
 */
function pdo_ping($dbconn){
  try{
    $dbconn->getAttribute(PDO::ATTR_SERVER_INFO);
  } catch (PDOException $e) {
    if(strpos($e->getMessage(), &#39;MySQL server has gone away&#39;)!==false){
      return false;
    }
  }
  return true;
}
?>

4、执行

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

mysql.server stop
Shutting down MySQL
.... SUCCESS! 
mysql.server start
Starting MySQL
 SUCCESS!


执行输出:

connect ok
Array
(
  [0] => Array
    (
      [id] => 2
      [name] => xfdipzone
    )

)
sleep 10

connect failure
Array
(
  [0] => Array
    (
      [id] => 3
      [name] => terry
    )

)
sleep 10

connect ok
Array
(
  [0] => Array
    (
      [id] => 3
      [name] => terry
    )

)
sleep 10

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

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

使用Composer自动加载php命名空间 

PHP 连接数据库的3种方式

redis在php下面的命令大全

Atas ialah kandungan terperinci php PDO实现判断连接是否可用的方法. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Apakah bentuk penuh PHP?Apakah bentuk penuh PHP?Apr 28, 2025 pm 04:58 PM

Artikel ini membincangkan PHP, memperincikan bentuk penuhnya, kegunaan utama dalam pembangunan web, perbandingan dengan Python dan Java, dan kemudahan pembelajarannya untuk pemula.

Adakah PHP adalah bahasa sensitif kes?Adakah PHP adalah bahasa sensitif kes?Apr 28, 2025 pm 04:55 PM

Kepekaan kes PHP berbeza -beza: Fungsi tidak sensitif, manakala pembolehubah dan kelas sensitif. Amalan terbaik termasuk penamaan yang konsisten dan menggunakan fungsi kes-insensitif untuk perbandingan.

Bagaimana anda mengalihkan halaman di PHP?Bagaimana anda mengalihkan halaman di PHP?Apr 28, 2025 pm 04:54 PM

Artikel ini membincangkan pelbagai kaedah untuk pengalihan halaman dalam PHP, yang memberi tumpuan kepada fungsi header () dan menangani isu -isu biasa seperti "tajuk telah menghantar" kesilapan.

Apakah PDO dalam PHP?Apakah PDO dalam PHP?Apr 28, 2025 pm 04:51 PM

Artikel ini membincangkan objek data PHP (PDO), lanjutan untuk akses pangkalan data dalam PHP. Ia menyoroti peranan PDO dalam meningkatkan keselamatan melalui kenyataan yang disediakan dan faedahnya terhadap MySQLI, termasuk abstraksi pangkalan data dan pengendalian ralat yang lebih baik.

Apakah Memcache dan Memcached dalam PHP? Adakah mungkin untuk berkongsi satu contoh memcache antara beberapa projek PHP?Apakah Memcache dan Memcached dalam PHP? Adakah mungkin untuk berkongsi satu contoh memcache antara beberapa projek PHP?Apr 28, 2025 pm 04:47 PM

Memcache dan Memcached adalah sistem caching PHP yang mempercepat aplikasi web dengan mengurangkan beban pangkalan data. Satu contoh boleh dikongsi di kalangan projek dengan pengurusan kunci yang teliti.

Apakah langkah -langkah untuk membuat pangkalan data baru menggunakan MySQL dan PHP?Apakah langkah -langkah untuk membuat pangkalan data baru menggunakan MySQL dan PHP?Apr 28, 2025 pm 04:44 PM

Artikel membincangkan langkah -langkah untuk membuat dan mengurus pangkalan data MySQL menggunakan PHP, memberi tumpuan kepada sambungan, penciptaan, kesilapan umum, dan langkah -langkah keselamatan.

Adakah JavaScript berinteraksi dengan PHP?Adakah JavaScript berinteraksi dengan PHP?Apr 28, 2025 pm 04:43 PM

Artikel ini membincangkan bagaimana JavaScript dan PHP berinteraksi secara tidak langsung melalui permintaan HTTP kerana persekitaran yang berbeza. Ia merangkumi kaedah untuk menghantar data dari JavaScript ke PHP dan menyoroti pertimbangan keselamatan seperti pengesahan data dan prot

Bagaimana cara melaksanakan skrip PHP dari baris arahan?Bagaimana cara melaksanakan skrip PHP dari baris arahan?Apr 28, 2025 pm 04:41 PM

Artikel ini membincangkan skrip PHP dari baris arahan, termasuk langkah -langkah, pilihan umum, kesilapan penyelesaian masalah, dan pertimbangan keselamatan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular