如何在 Symfony 5.3 中管理 Messenger 组件内存

How to manage Messenger component memory in Symfony 5.3

我在 Symfony 5.3 中为我的项目使用 Messenger Component 和 RabittMQ 服务器。我想管理我的 MessageHandler 内存,因为我的代码占用了太多内存 (Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 33554440 bytes)。

对于消费的每条消息,我觉得 MessageHandler 保留了前一个 MessageHandler 的记忆。这是我的 class 我 运行 一个命令:

class MessageHandler implements MessageHandlerInterface
{

    private KernelInterface $kernel;

    public function __construct(KernelInterface $kernel)
    {
        $this->kernel = $kernel;
    }

    /**
     * @param RequestMessage $requestMessage
     * @throws \Exception
     */
    public function __invoke(RequestMessage $requestMessage)
    {
        $application = new Application($this->kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput([
            'command' => 'app:my-command',
            'userId' => $requestMessage->getUserId(),
            '--no-debug' => ''
        ]);


        $output = new BufferedOutput();
        $application->run($input, $output);
    }
}

然后我使用此命令使用我的消息:

$ php bin/console messenger:consume -vv

我正在寻找一种解决方案来使用独立内存来处理我的每条消息。不知道问题出在哪里,有没有大神帮帮我。

我能想到内存泄漏,但我不明白为什么不清理一条消息的内存。

Deploying to Production

On production, there are a few important things to think about:

Don't Let Workers Run Forever
Some services (like Doctrine's EntityManager) will consume more memory over time. So, instead of allowing your worker to run forever, use a flag like messenger:consume --limit=10 to tell your worker to only handle 10 messages before exiting (then Supervisor will create a new process). There are also other options like --memory-limit=128M and --time-limit=3600.

发件人:Symfony Messenger Docs

首先,我知道我有内存问题,但我必须找到解决方案。

为了 运行 我的命令,我在不同的进程中使用 Symfony 的 Process 组件来 运行 我的命令,以不让 RAM 和 运行 独立地过载。这是我的解析代码:

use Symfony\Component\Process\Process;

$completedCommand = 'php bin/console app:my-command ' . $user->getId() . ' --no-debug';
$process = Process::fromShellCommandline($completedCommand);
$process->run();

if (!$process->isSuccessful()) {
    // Example: Throw an exception...
}