PHP交互式数据库超时推进

时间:2012-11-09 08:39:43

标签: php mysql propel phpsh

如何在使用PHP Interactive Shell期间使MySQL数据库始终可用?

我遇到的问题是我在开始时连接到DB并且很快就会超时。系统管理员将MySQL数据库的超时设置为10秒(空闲),我无法更改该值。但是,此值不足以与Propel对象及时与shell交互。我在不改变MySQL服务器配置的情况下寻找方法。

例如

// Assume that User is the Propel class
$con = User::create();
$first = $con->findPk(2); // Still alive
sleep(11);
$second = $con->findPk(1); // Dead -- Return NULL

MySQL变量的详细信息(请注意,我不允许更改这些变量)

+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 360   |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 28800 |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 28800 |
+----------------------------+-------+

1 个答案:

答案 0 :(得分:0)

如果你真的无法在数据库端解决这个问题,那么就有解决方法。 可悲的是,我不知道如何使用Propel2(我使用Doctrine2做了类似的事情),但也许有人会建议它。

我们的想法是创建Propel将使用的连接类,而不是默认的连接类。在这个类中,你必须确保连接在每个查询中仍然存在,如果不是 - 创建新连接(所有这些都应该以静默方式进行)。

看起来像这样:

class Connection
{
    // ...
    public function query($stmt)
    {
        $result = $this->pdo->query($stmt);
        if (!$result) {
            $this->reconnect();
            $result = $this->pdo->query($stmt);
        }
        return $result;
    }
    // ...
}

PS Again - 如果您可以在数据库端解决问题,则不应该这样做