php - 如果打开的连接太多,我怎样才能让 php pdo 代码继续重试连接?

标签 php mysql pdo multi-user

我有一个问题,现在才突然出现。我使用的是最多有 10 个并发数据库连接的共享网络托管计划。 Web 应用程序有几十个查询,一些是 pdo,一些是 mysql_*。

加载一个页面时,特别是在 5-6 个并发连接时达到峰值,这意味着至少需要 2 个用户同时加载它才能在其中一个或两个上吐出错误。

我知道这是低效的,我确信我可以减少很多,但这就是我目前的想法是将 pdo 代码移动到一个函数中,只传入一个查询字符串和一个数组变量,然后让它返回一个数组(部分是为了整理我的代码)。

实际问题:

我怎样才能让这个函数继续重试直到它设法执行,并阻止调用它的脚本(以及任何可能调用该脚本的脚本)直到它设法执行并返回它的数据?我不希望事情乱序执行,我很高兴代码在高峰时段延迟一秒左右

由于有人会要求提供代码,所以这就是我目前所做的。我把它放在一个单独的文件中,所以我有一个中心位置来更改连接参数。 if 语句只是为了消除当我从测试服务器切换到 liver 服务器时不断更改参数的需要

$dbtype = "mysql";
$server_addr = $_SERVER['SERVER_ADDR'];
if ($server_addr == '192.168.1.10') {
    $dbhost = "localhost";
} else {
    $dbhost = "xxxxx.xxxxx.xxxxx.co.nz";
}
$dbname = "mydatabase";
$dbuser = "user";
$dbpass = "supersecretpassword";

我在函数顶部“包含”该文件

 include 'db_connection_params.php';
        $pdo_conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);

然后在一个连接上运行这样的命令

$sql = "select * from tbl_sub_cargo_cap where sub_model_sk = ?";
$capq = $pdo_conn->prepare($sql);
$capq->execute(array($sk_to_load));
while ($caprow = $capq->fetch(PDO::FETCH_ASSOC)) {
//stuff
}

最佳答案

一个页面不需要 5-6 个并发连接,每个页面应该只使用 1 个连接。我会尝试重新设计应用程序中导致单个页面上出现多个连接的任何部分。

但是,您应该能够在连接失败时捕获 PDOException (documentation on connection management),然后重试一定次数。

一个简单的例子,

<?php
$retries = 3;
while ($retries > 0)
{
    try
    {
        $dbh = new PDO("mysql:host=localhost;dbname=blahblah", $user, $pass);
        // Do query, etc.
        $retries = 0;
    }
    catch (PDOException $e)
    {
        // Should probably check $e is a connection error, could be a query error!
        echo "Something went wrong, retrying...";
        $retries--;
        usleep(500); // Wait 0.5s between retries.
    }
}

关于php - 如果打开的连接太多,我怎样才能让 php pdo 代码继续重试连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929968/

相关文章:

php - ajax调用login.php,响应失败

php - 显示左连接查询的数据 [Laravel 5]

php - 如何在cakephp2中运行普通的sql查询并获取结果

php - 将变量从 PHP 传递到 Python

php - MySQL - 根据关系表的值在最终输出中添加额外的列

php - Mysql 一行左连接

mysql - 我是否创建了一个不需要的 MySQL 表?

mysql - 如何显示每个评级的员工数量?

php - 使用 PHP 和 PDO 从 MySQL 检索 MEDIUMBLOB 失败

php - PDO - 插入(INSERT INTO ...)代码不起作用