首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果有太多打开的连接,我如何让php pdo代码继续重试连接?

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

Stack Overflow用户
提问于 2013-02-18 13:21:29
回答 2查看 5K关注 0票数 5

我有一个问题,它现在才突然出现。我在一个共享虚拟主机计划,有最多10个并发数据库连接。这个web应用程序有几十个查询,一些是pdo,一些是mysql_*。

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

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

实际的问题是:

我如何让这个函数继续重试,直到它成功执行,并阻止调用它的脚本(以及任何可能调用它的脚本),直到它成功执行并返回它的数据?我不想让事情无序地执行,我很高兴代码在高峰期被延迟了一秒钟左右

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

代码语言:javascript
运行
复制
$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";

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

代码语言:javascript
运行
复制
 include 'db_connection_params.php';
        $pdo_conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);

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

代码语言:javascript
运行
复制
$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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 13:53:03

你不应该为一个页面需要5-6个并发连接,每个页面应该只使用一个连接。我会尝试重新设计应用程序的任何部分,这些部分会在单个页面上造成多个连接。

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

举个简单的例子,

代码语言:javascript
运行
复制
<?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.
    }
}
票数 7
EN

Stack Overflow用户

发布于 2013-02-18 13:49:44

10个并发连接是很多的。它可以轻松地为10-15个在线用户服务。需要付出很大的努力才能使他们筋疲力尽。

所以你的代码有问题。

主要有两个原因:

  • 慢查询花费的时间太长,因此提供一个命中的服务使用一个mysql连接的时间太长。
  • 从每个脚本打开多个连接。

前者必须进行调查,但对于后者来说很简单:

  1. 请勿在一个脚本中混合使用myqsl_和PDO :您一次只能打开2个连接。
  2. 使用PDO时,只打开connection 一次,然后在整个代码中使用它。

在一个脚本中减少连接数量是唯一的办法。

如果您代码中有PDO类的多个实例,则需要向每个调用添加所需的超时处理代码。因此,不管怎样,都需要大量的代码重写。

将这些新实例替换为global $pdo;。它将花费相同的时间,但它将是永久的解决方案,而不是你想要的临时补丁。

请理智一点。

PHP会自动关闭脚本末尾的所有连接,您不必关心是否手动关闭它们。

在整个脚本中只有一个连接是一种常见的做法。它被世界各地的所有开发人员使用。你可以毫不犹豫地使用它。就用它吧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14929968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档