如果有太多打开的连接,如何让php pdo代码继续尝试连接?

如果有太多打开的连接,如何让php pdo代码继续尝试连接?,php,mysql,pdo,multi-user,Php,Mysql,Pdo,Multi User,我有个问题,现在才出现。我在一个共享网络托管计划中,该计划最多有10个并发数据库连接。这个web应用程序有几十个查询,一些是pdo,一些是mysql 加载一个页面在5-6个并发连接时达到峰值,这意味着至少需要2个用户同时加载页面,才能在其中一个或两个页面上吐出错误 我知道这是低效的,我相信我可以减少很多,但我现在的想法是将pdo代码移动到一个函数中,只传入一个查询字符串和一个变量数组,然后让它返回一个数组(部分是为了整理我的代码) 实际问题是: 我如何才能让这个函数继续重试,直到它成功执行为止,

我有个问题,现在才出现。我在一个共享网络托管计划中,该计划最多有10个并发数据库连接。这个web应用程序有几十个查询,一些是pdo,一些是mysql

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

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

实际问题是:

我如何才能让这个函数继续重试,直到它成功执行为止,并保留调用它的脚本(以及可能调用该脚本的任何脚本),直到它成功执行并返回其数据为止?我不希望事情按顺序执行,我很高兴代码在高峰期被延迟一秒钟左右

因为有人会要求代码,我现在做的就是这样。我在它自己的一个文件中有这个,所以我有一个中心位置来更改连接参数。if语句仅仅是为了消除在我从测试服务器切换到服务器时不断更改参数的需要

$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
}

10个并发连接非常多。它可以方便地为10-15名在线用户提供服务。 需要付出巨大的努力来耗尽它们。
所以你的代码有问题

这主要有两个原因:

  • 慢速查询需要花费太多的时间,因此一次点击使用一个mysql连接的时间太长
  • 从每个脚本打开多个连接
前者必须进行调查,但后者很简单:

  • 不要在一个脚本中混合使用myqsl和PDO:一次打开两个连接
  • 使用PDO时,只打开连接一次,然后在整个代码中使用它
  • 减少一个脚本中的连接数是唯一的方法。
    如果您的代码中有多个PDO类实例,则需要将超时处理代码添加到每个调用中。因此,无论如何都需要大量的代码重写。
    将这些新实例替换为
    global$pdo取而代之。这将花费相同的时间,但它将是永久解决方案,而不是您想要的临时补丁。
    请理智一点

    PHP会在脚本结束时自动关闭所有连接,您不必担心手动关闭它们。

    在一个脚本中只有一个连接是一种常见做法。全世界的开发者都在使用它。你可以毫无疑问地使用它。只需使用它。

    一个页面不需要5-6个并发连接,每个页面应该只使用一个连接。我会尝试重新构建应用程序的任何部分,使其在一个页面上产生多个连接

    但是,您应该能够在连接失败()时捕获PDO异常,然后重试若干次

    举个简单的例子

    <?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.
        }
    }
    

    在“5-6并发连接”下你是什么意思?来自一个脚本的5-6个连接或5-6个在线用户?还是别的什么?您的脚本的平均运行时间是多少?是的,从一个脚本开始。我意识到这是低效的,但6个月前我还是一名学生的时候写了这部分内容,当时我不知道这些限制。我现在正在重新编写代码,以提高效率,但我也希望加入保障措施,以防止几个月后出现问题。为什么投票失败?是因为我曾经有过一个坏主意吗?或者是因为6个月前我一直在努力让它运行,更不用说它的效率了?有了一个全局$pdo,连接还会在脚本结束时关闭吗?