如何在 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 的 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...
}
我在 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 的 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...
}