我想在内核终止后运行重负载来哈希用户密码。
我在 Controller 中有这个:
public function insert(Request $request): Response
{
...
// listener to update passwords
$this->eventDispatcher->addListener(KernelEvents::TERMINATE, function () use ($users) {
foreach ($users as $user) {
$this->hashPassword($user); //for 100 users will take 40 seconds
}
});
return $this->redirectToRoute('some_route');
}
用户被重定向到新路由,密码在数据库中进行哈希处理。但问题是并非所有密码都经过哈希处理。好像半途而废了。
这与执行时间有关吗?如果是的话我该如何绕过它?不改变 php 执行时间。
谢谢。
最佳答案
您的问题意味着执行时间正在停止您的进程,并且您的存储引擎不尊重 ACID(原子性、一致性、隔离性和持久性)属性。您的请求不受交易保护。
首先,我建议你使用事务并在流程结束时提交,因为只更新部分数据是非常危险的。
那么,一个“糟糕”的解决方案是增加执行时间。
但最好的解决方案是使用异步消息。您可以使用 Symfony Messenger 发送异步消息。 Fabien Potencier 撰写的 Symfony 书解释了如何做到这一点 in this chapter 。 Fabien 向我们展示如何检查邮件是否为垃圾邮件。您无需检查消息,只需对所有未散列的密码进行散列即可。在此Messenger中,增加执行时间并不危险。
关于php - symfony 事件监听器的执行时间是否也有限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74152350/