如何在使用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 |
+----------------------------+-------+
答案 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 - 如果您可以在数据库端解决问题,则不应该这样做