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

Kel*_*sen 5 php mysql pdo multi-user

我有一个问题,它现在才出现.我在共享的Web托管计划中,最多有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";
Run Code Online (Sandbox Code Playgroud)

我'在函数顶部包含'该文件

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

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

$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
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*ams 7

对于单个页面,您不需要5-6个并发连接,每个页面应该只使用1个连接.我会尝试重新构建应用程序的任何部分,导致单个页面上出现多个连接.

但是,您应该能够在连接失败时捕获PDOException(连接管理文档),然后重试多次.

一个简单的例子,

<?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.
    }
}
Run Code Online (Sandbox Code Playgroud)