如何在长时间运行的进程上保持 Doctrine DBAL 连接处于活动状态,该进程闲置数小时等待输入?

How to keep-alive a Doctrine DBAL connection on a long-running process that is idle for hours awaiting input?

提问人:Xavi Montero 提问时间:6/26/2023 更新时间:6/28/2023 访问量:129

问:

我有一个长时间运行的进程,一个在后面使用 ReactPhp 并持续运行数小时的 symfony 命令。

如果未使用 DBAL $connection,则会中断,并且下次进入并处理请求时,将引发异常。

我想知道这是否是不可恢复的,或者学说提供了一种“刷新”连接的机制(某种保持活力)。

我都跑过了

php bin/console debug:config doctrine
php bin/console config:dump-reference doctrine

我没有运气。

问题

我可以添加某种“keep-alive”指令,每 5 分钟发送一次某种虚拟指令以避免连接中断吗?SELECT 1

symfony 连接 超时 keep-alive dbal

评论


答:

0赞 Rufinus 6/28/2023 #1

您只需要测试并重新打开您的连接。

use Doctrine\Persistence\ManagerRegistry;

class MyService
{

    public function __construct(protected ManagerRegistry $managerRegistry)
    {}

    public function getWhatever(): Collection|array
    {
         $qb = $this->getEntityManagerFor(MyEntity::class)->createQueryBuilder('myentity');
         $qb->andWhere('myentity.whatever = :whatever')
            ->setParameter('whatever', 'what?');

         return $qb->getQuery()->getResult();
    }

    protected function getEntityManagerFor(string $entityClass): EntityManager
    {
        if (!$this->managerRegistry->getManagerForClass($entityClass)->isOpen()) {
            $this->managerRegistry->resetManager();
        }

        return $this->managerRegistry->getManagerForClass($entityClass);
    }
}

如果您有关闭管理器的 SQL 错误,这也是有用的。