Php 如何执行任务以避免用户被迫等待响应?
在用户创建了一个新产品之后,在我的应用程序中,我会执行一些操作,比如更新几个表:统计、财务、使用、库存等 现在用户必须等待我完成所有步骤。如果有很多用户同时做这件事,那么等待的时间就要长得多,这就不太好了 我的计划是创建一个特殊任务表(产品id、时间、任务id),然后在后台运行此任务,但:Php 如何执行任务以避免用户被迫等待响应?,php,symfony,task,Php,Symfony,Task,在用户创建了一个新产品之后,在我的应用程序中,我会执行一些操作,比如更新几个表:统计、财务、使用、库存等 现在用户必须等待我完成所有步骤。如果有很多用户同时做这件事,那么等待的时间就要长得多,这就不太好了 我的计划是创建一个特殊任务表(产品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将执行所需的任务(在后台),而不会降低用户体验
一些参考资料:
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);