使用 Doctrine 长时间运行的 php 进程

use*_*660 1 symfony doctrine-orm

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

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

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

tft*_*ftd 5

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

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