Php 如何执行任务以避免用户被迫等待响应?

Php 如何执行任务以避免用户被迫等待响应?,php,symfony,task,Php,Symfony,Task,在用户创建了一个新产品之后,在我的应用程序中,我会执行一些操作,比如更新几个表:统计、财务、使用、库存等 现在用户必须等待我完成所有步骤。如果有很多用户同时做这件事,那么等待的时间就要长得多,这就不太好了 我的计划是创建一个特殊任务表(产品id、时间、任务id),然后在后台运行此任务,但: 老一辈 不要停止用户进行下一个操作 尽快运行此任务 我怎么能在Symfony做呢 最好的方法是什么 最好的方法是什么 我不知道这是否是最好的方式,但处理这类案件最常见的方式(根据fews提供的信息)是:

在用户创建了一个新产品之后,在我的应用程序中,我会执行一些操作,比如更新几个表:统计、财务、使用、库存等

现在用户必须等待我完成所有步骤。如果有很多用户同时做这件事,那么等待的时间就要长得多,这就不太好了

我的计划是创建一个特殊任务表(产品id、时间、任务id),然后在后台运行此任务,但:

  • 老一辈
  • 不要停止用户进行下一个操作
  • 尽快运行此任务
我怎么能在Symfony做呢

最好的方法是什么

最好的方法是什么

我不知道这是否是最好的方式,但处理这类案件最常见的方式(根据fews提供的信息)是:

  • 将一个或多个数据库中的“操作”(更新统计、财务、使用、库存等)解耦,以便能够重用 它无处不在
  • 创建“event”类(最后是一个简单的DTO),在您的示例中可以是
    NewProductEvent
    ,其中存储新产品对象:
  • 创建“listener”类
    NewProductListener
    ,在该类中处理执行哪个“操作”以及按照哪个顺序等
现在用户必须等待我完成所有步骤

为了避免这种情况,我们必须能够仅在响应已送达客户之后“发送”我们创建的
新产品
事件,我们可以这样做,更具体地说,我们可以这样做

但是如何存储产品数据以使其在内核上可用。终止?

让我们去实现它

“事件”类:

“侦听器”类:

侦听器“服务”定义:

<service id="new_product_listener"
         class="YourApp\YourBundle\Event\NewProductListener">
    <!-- you can inject in the listener, as argument, each service task you need -->
    <!-- <argument type="service" id="financial_operation_service"/>-->
    <!-- <argument type="service" id="usage_operation_service"/>-->
    <tag name="kernel.event_listener" event="new_product_created" method="onNewProductCreated"/>
    <tag name="kernel.event_listener" event="kernel.terminate" method="performTasks"/>
</service>
当您发送NewProductEvent::EVENT\u名称时(
新建的产品
)您将在
NewProductListener
监听器的
$product
变量中存储触发
onNewProductCreated
方法的产品数据,以便在触发
内核后能够使用它。terminate
事件

这样,Symfony将执行所需的任务(在后台),而不会降低用户体验

一些参考资料:


感谢@gp\u sflover的全面解释。
class NewProductListener
{
    protected $product;

    public function __construct()
    {
        # then you can inject all dependencies needed to perform your tasks
    }

    public function onNewProductCreated(Product $newProduct)
    {
        # here you keep in memory the product data!
        $this->product = $newProduct->getProduct();
    }

    public function performTasks()
    {
        if ($this->product) {
            # here you can put the logic to perform all needed tasks!
        }
    }
}
<service id="new_product_listener"
         class="YourApp\YourBundle\Event\NewProductListener">
    <!-- you can inject in the listener, as argument, each service task you need -->
    <!-- <argument type="service" id="financial_operation_service"/>-->
    <!-- <argument type="service" id="usage_operation_service"/>-->
    <tag name="kernel.event_listener" event="new_product_created" method="onNewProductCreated"/>
    <tag name="kernel.event_listener" event="kernel.terminate" method="performTasks"/>
</service>
// presuming you are in a controller:
$dispatcher = $this->get('event_dispatcher');
$newProduct = //--- I don't know from where it will come.
$event      = new NewProductEvent($newProduct);
$dispatcher->dispatch(NewProductEvent::EVENT_NAME, $event);