使用Doctrine长时间运行php进程

时间:2017-07-18 15:50:54

标签: symfony doctrine-orm

我创建了一个Symfony 3命令,预计会运行数天(甚至数周)。它使用Doctrine 2来读取一些初始数据并不时地写入执行状态。 SQL预计需要几毫秒。

我担心的是,如果MySQL连接由于不活动而关闭,整个过程最终会崩溃。

问题:是Doctrine在flush次来电之间保持数据库连接打开吗?或者,每次调用flush时是否重新连接?

2 个答案:

答案 0 :(得分:3)

AFAIK Symfony将在您的应用中第一次使用Doctrine时打开与数据库的连接,并在发送HTTP请求时将其关闭(或者如果您明确告诉Doctrine将其关闭)。连接后,Doctrine将使连接处于活动状态,直到您明确关闭它(并且在flush()之前,期间和之后将处于活动状态)

在您的情况下,您可能应该在需要时明确打开和关闭数据库连接。类似下面的代码可以解决您的问题:

// When you need the DB
/**
 * @var \Doctrine\DBAL\Connection $connection
 */
$connection = $this->get('doctrine')->getConnection();
// check if the connection is still active and if not connect to the db
if(!$connection->isConnected()) {
    $connection->connect();
}
// Your code to update the database goes after this.

your code

// Once you're done with the db update - close the connection.
if($connection->isConnected()) {
    $connection->close(); // close the db connection;
}

这将避免数据库连接超时等,但是如果这个脚本只要你说这个脚本就会运行,你应该非常小心内存泄漏。使用Symfony可能不是解决此问题的最佳方法。

答案 1 :(得分:-1)

您可以每隔1000秒ping一次连接,小于MySQL的连接限制。

最好的办法是运行一个监督流程(例如supervisord),这会在您的应用停止后立即重启流程。然后你可以简单地告诉你的脚本在删除连接之前退出(因为它是一个配置的值,在MySQL中,例如它是wait_timeout变量)。监督过程将注意到您的应用程序已停止并将重新启动它。