PDO:如何检查连接是否确实有效?

2023-11-23

曾经有过two 问题已经讨论过这个问题,但没有人真正回答这个问题。

我知道如果连接失败,PDO 会抛出异常(假设您启用PDO::ERRMODE_EXCEPTION),但我想测试连接是否still活跃,可能是几个小时后。

我有一个长时间运行的脚本,一段时间后它就超时了。理论上我可以增加这个时间PDO::ATTR_TIMEOUT但基本上我想编写一个函数来给我返回一个活动连接 - 要么是一个现有连接,如果它已经建立了并且还没有超时或重新连接(如果有)。

我应该这样做吗SELECT 1,捕获异常,然后重新连接?或者有更好的方法吗?


MySQL协议支持一个特殊的命令COM_PING用于此目的,C API有一个调用mysql_ping()发送它。这将测试连接是否处于活动状态。

如果连接是使用 MYSQL_OPT_RECONNECT 创建的,则自动连接(https://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html).

不幸的是,如果您使用当前版本的 PDO,则这些功能均不受支持。您只能提交 SQL 查询字符串,不能提交特殊命令。而且PDO现在使用mysqlnd驱动程序,它有其优点但不支持重新连接选项。所以这个问题无论如何都是无意义的。

我不知道还有什么比尝试发出“虚拟”查询更优雅的解决方案SELECT 1,捕获异常,如果收到错误代码 2006(服务器已消失),则重新连接。

您可以创建一个单例类来保存数据库连接,并在每次应用程序代码调用 getConnection() 时测试实时连接。这是我测试过的一个例子:

class DB
{
    protected static $pdo = null;

    public static function getConnection() {
        // initialize $pdo on first call
        if (self::$pdo == null) {
            self::init();
        }

        // now we should have a $pdo, whether it was initialized on this call or a previous one
        // but it could have experienced a disconnection
        try {
            echo "Testing connection...\n";
            $old_errlevel = error_reporting(0);
            self::$pdo->query("SELECT 1");
        } catch (PDOException $e) {
            echo "Connection failed, reinitializing...\n";
            self::init();
        }
        error_reporting($old_errlevel);

        return self::$pdo;
    }

    protected static function init() {
        try {
            echo "Opening new connection...\n";
            self::$pdo = new PDO('mysql:host=huey;dbname=test', 'root', 'root');
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die($e->getMessage());
        }
    }
}

像这样使用它:

echo "Query for 2:\n";
$pdo = DB::getConnection();
echo $pdo->query("SELECT 2")->fetchColumn() . "\n";

echo "\nSleeping 10 seconds...\n";
sleep(10); /* meanwhile I use another window to KILL the connection */
echo "\n";

echo "Query for 3:\n";
$pdo = DB::getConnection();
echo $pdo->query("SELECT 3")->fetchColumn() . "\n";

Output:

Query for 2:
Opening new connection...
Testing connection...
2

Sleeping 10 seconds...

Query for 3:
Testing connection...
Connection failed, reinitializing...
Opening new connection...
3

您可以看到它检测到连接失败并重新初始化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDO:如何检查连接是否确实有效? 的相关文章

  • PHP 中的encodeURI() ?

    PHP 中是否有一些不编码的encodeURI 函数 我现在用这个 function encodeURI url http php net manual en function rawurlencode php https develope
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • 点击 %40 变为 %2540

    当单击包含 符号的链接时 该网址给我 40 这就是我想要的 但是一旦我点击它 一秒钟后它就在我点击后变成了 2540 单击是在电子邮件内 然后定向到网站 其中 40 更改为 2540 我怎样才能让它停止变化 它现在得到这样的参数 email
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 所有 PHP 相等比较都是对称的吗?

    Is a b总是等价于 b a 我认为在 JavaScript 中 由于强制转换 有一些奇怪的情况并非如此 I think ide https stackoverflow com questions 4752579 are all php
  • 如何关闭未关闭的 HTML 标签?

    每当我们从数据库或类似来源获取一些经过编辑的用户输入内容时 我们可能会检索仅包含开始标记但不包含结束标记的部分 这可能会妨碍网站当前的布局 有客户端或服务器端的方法来解决这个问题吗 找到了一个很好的答案 使用 PHP 5 并使用 DOMDo
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 使用 PHP Selenium Webdriver 单击下拉菜单中的选项?

    我正在使用 PHP Selenium Webdriver 包装器Facebook https github com facebook php webdriver 任何人都可以给我一个如何单击或从选择下拉菜单中选择选项的示例吗 我已经尝试过这
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • Google Cloud SQL 上的故障转移如何运作?

    我打算将 PHP 应用程序 从 Google Cloud Platform 外部的服务器 连接到 Google Cloud SQL 我想知道如何设计应用程序以正确地对其数据库进行故障转移 根据manual https cloud googl
  • 未传递“client_reference_id”参数

    我使用 Stripe Checkout Stripe 版本 2016 07 06 我想通过参数 client reference id 恢复个性化数据 但在 JSON 中 当我有金额或电子邮件时 我找不到它 我是在测试环境中 你能帮我吗 先
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O
  • 检查 PHP 中的字符串长度

    我有一个长度为 141 个字符的字符串 使用下面的代码我有一个if如果字符串大于或小于 140 则语句返回一条消息 libxml use internal errors TRUE dom new DOMDocument dom gt loa
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 从字符串中获取数字

    我有一个字符串 例如 lorem 110 ipusm 我想获取 110 我已经尝试过这个 preg match all 0 9 string ret 但这正在返回 Array 0 gt 1 1 gt 1 2 gt 0 我想要这样的东西 Ar
  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get
  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之

随机推荐

  • FindFirstFileEx 的文件系统支持,仅限于目录

    我正在使用Windows API函数查找第一个文件Ex因为它提供了仅返回给定目录的子目录 忽略文件 的功能 但是 当我使用 required 标志调用此函数时 我仍然会收到文件和目录 MSDN 文档的FindExSearchLimitToD
  • 合法的数组赋值。是否可以?

    在阅读了 K R 书中有关结构的章节后 我决定做一些测试来更好地理解它们 所以我写了这段代码 include
  • OpenIdConnectAuthenticationHandler:message.State 为 null 或为空

    我正在使用 ASP Net Core 应用程序的 UseOpenIdConnectAuthentication 中间件来针对戴尔云访问管理器令牌提供商进行身份验证 设置以提供 OpenId OAuth2 身份验证 以下是代码 app Use
  • 全文搜索是答案吗?

    好的 我有一个看起来像这样的 mySQL 数据库 ID 一个 int 和记录的唯一 ID 标题 项目的名称 描述 项目描述 我想搜索目前我正在使用的关键字的标题和描述 选择 来自 项目 其中标题类似 key 这是可行的 因为数据库中没有太多
  • Memcached:AWS Elasticache 上的自动发现 python 支持?

    我开始将 AWS Elasticache 与我的 django Web 应用程序结合使用 我首先使用自动发现功能将缓存位置设置为唯一端点 但它似乎不起作用 我使用 pylibmc 1 2 2 和 django pylibmc sasl 0
  • 在 Windows Server 2008 上构建 Windows Phone 7 项目

    我的公司正计划针对 Windows Phone 7 进行开发 但是 我们拥有的构建服务器运行的是 Windows Server 2008 根据Windows Phone SDK 发行说明我了解到该 SDK 仅不支持 Windows Serv
  • 有哪些好方法可以防止人们复制我的源代码? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有很多定制的 JavaScript 和布局设计 我想阻止人们使用这些 有没有什么实用的方法可以做到这一点 或者我基本上只需要高兴我的 php 代码没有显示 我想让至少让复制我的
  • 如何查看 git 中忽略的文件列表?

    过去几个月我一直在使用 git 我喜欢 git 我想知道是否有一个命令可以显示项目中被忽略的文件列表 我试过这个git status ignored从项目的根目录 但这似乎还不够 您可以使用clean带有选项的命令 n dry run Do
  • awk:对数组a的非法引用

    我正在尝试使用这个 awk 命令 awk F FILENAME ARGV 1 a FNR 1 FILENAME ARGV 2 for i 1 i lt length a i if match 0 a i print a i 1 16 pas
  • Autohotkey 应用程序特定热键

    我是 Autohotkey 的新手 尽管阅读了这个网站和官方文档 但我还是无法弄清楚这一点 我只想让某些热键仅适用于某些应用程序 例如 如果我在某个游戏中按空格键 我希望它发送 坟墓 但如果我不在该游戏中 我希望空格键正常工作 当我不玩游戏
  • ESLint:插件“react”之间存在冲突

    我在一个整体 npm 组件包内有一个 React 应用程序 React 应用程序用作演示站点 它使用此组件包作为 Storybook 之上的集成步骤 local component package storybook demos react
  • OpenMP while 循环

    我有一个运行多次迭代的代码 只有满足条件时 才会保存迭代的结果 这自然地表示为 while 循环 我试图使代码并行运行 因为每个实现都是独立的 所以我有这个 while nit
  • 如何在log4j.xml中设置过滤器

    HI 在我们的 Web 应用程序中 它打印所有日志 就像 Spring 和 JSF jar 文件一样 这对我们来说不是必需的 如何在 log4j xml 文件中设置为仅针对我们的应用程序进行过滤 Updated 以下是我们用于日志记录的配置
  • 编译器错误:“需要类、接口或枚举”

    我已经花了几个小时对该程序进行故障排除 尝试了几种配置 但没有成功 它是用java编写的 有33个错误 从之前的50个减少 源代码 This program is named derivativeQuiz java stored on a
  • SimpleUrlHandlerMapping的Java配置(Spring boot)

    我有一个现有的 Spring Web 应用程序 它使用两个扩展 AbstractController 的控制器 我想将 Spring Boot 集成到应用程序中 以便我们可以将其作为独立应用程序运行 我面临一个问题 因为 Spring 没有
  • Codeigniter:在将表单提交给控制器之前如何加密密码?

    我有一个简单的html登录表单
  • “核心数据不是关系数据库。”为什么知道这一点很重要?

    我意识到这对很多人来说可能是常识 所以如果这看起来像一个愚蠢的问题 我深表歉意 我正在尝试学习iOS编程的核心数据 并且我反复阅读和听到它说核心数据 CD 不是关系数据库 但关于这一点 或者为什么了解超越学术意义的确切内容很重要 却很少有其
  • 如何使用 C# 识别文件的扩展名/类型?

    我有一个工作流程 允许用户上传任何文件 然后将读取该文件 现在我的问题是 如果用户有图像文件 xyz jpg 并且他仅将其重命名为 xyz 删除扩展名 那么我们仍然可以使用 读取文件数据 元数据来获取文件的类型 扩展名 谢谢大家 See P
  • go regex 是否将任何字符匹配换行符

    Go s re2语法文档表示任意字符 匹配任何 字符 包括换行符 s true 不过我写了一个简单的程序 结果显示任何字符根本不匹配换行符 该程序 可以在这里找到 http play golang org p pccP52RvKS 像大多数
  • PDO:如何检查连接是否确实有效?

    曾经有过two 问题已经讨论过这个问题 但没有人真正回答这个问题 我知道如果连接失败 PDO 会抛出异常 假设您启用PDO ERRMODE EXCEPTION 但我想测试连接是否still活跃 可能是几个小时后 我有一个长时间运行的脚本 一