php - symfony 事件监听器的执行时间是否也有限?

标签 php symfony kernel symfony4

我想在内核终止后运行重负载来哈希用户密码。

我在 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/

相关文章:

Symfony2 表单事件 - 下拉列表

php - "Cannot set session ID after the session has started."测试表单时

linux - 模拟 USB 设备以实现自动化

php - WooCommerce 运费计算器 (shipping-calculator.php) - PHP 覆盖 - 仅限邮政编码

php - 允许特殊字符和代码注入(inject)

javascript - 通过 AJAX 或 PHP 将 JavaScript 数据写入 JSON 文件

linux - 进程被linux内核杀死?

php - 多页表单和 session 与隐藏表单数据

php - Symfony2 禁用缓存?

linux - 我的自旋锁有问题吗?