Gre*_*ene 4 php asynchronous symfony
首先,关于我的项目的一些基本信息:我有一个使用Symfony 3构建的网站.对于某些任务,我正在考虑实现运行异步PHP方法.有些事件需要花费很多时间,但结果不一定非常明显.
例如:在方法中newOrder我有函数addUserLTV谁做了几步.客户不必等待所有步骤完成,只需在基本操作后立即获得确认 - "newOrder"将添加addUserLTV到队列并立即显示确认(已完成运行).当服务器有时间执行时,将运行队列任务.
public function addUserLTV( $userID, $addLTV )
{ //same code
}
Run Code Online (Sandbox Code Playgroud)
怎么做?在交响曲3中有可能吗?
Mak*_*yar 13
这是您可以使用enqueue bundle轻松完成的事情.关于你为什么要选择它的几句话:
关于你的问题.以下是使用enqueue bundle执行此操作的方法.按照从文档设置说明.
现在该addUserLTV方法将如下所示:
<?php
namespace Acme;
use Enqueue\Client\ProducerInterface;
class AddUserLTVService
{
/**
* @var ProducerInterface
*/
private $producer;
/**
* @param ProducerInterface $producer
*/
public function __construct(ProducerInterface $producer)
{
$this->producer = $producer;
}
public function addUserLTV( $userID, $addLTV )
{
$this->producer->sendCommand('add_user_ltv', [
'userId' => $userID,
'ltv' => $addLTV]
);
}
}
Run Code Online (Sandbox Code Playgroud)
它使用客户端将消息发送到消息队列(我之前提到的顶级抽象).该服务必须注册到Symfony容器:
services:
Acme\AddUserLTVService:
arguments: ['@enqueue.producer']
Run Code Online (Sandbox Code Playgroud)
现在让我们来看看消费方面.您需要一个执行该任务的命令处理器:
<?php
namespace Acme;
use Enqueue\Client\CommandSubscriberInterface;
use Enqueue\Psr\PsrContext;
use Enqueue\Psr\PsrMessage;
use Enqueue\Psr\PsrProcessor;
use Enqueue\Util\JSON;
class AddUserTVAProcessor implements PsrProcessor, CommandSubscriberInterface
{
public function process(PsrMessage $message, PsrContext $context)
{
$data = JSON::decode($message->getBody());
$userID = $data['userID'];
$addLTV = $data['ltv'];
// do job
return self::ACK;
}
public static function getSubscribedCommand()
{
return 'add_user_ltv';
}
}
Run Code Online (Sandbox Code Playgroud)
将其注册为带有enqueue.client.processor标记的服务:
services:
Acme\AddUserTVAProcessor:
tags:
- {name: 'enqueue.client.processor'}
Run Code Online (Sandbox Code Playgroud)
这就是编码.运行consume命令,您就完成了:
./bin/console enqueue:consume --setup-broker -vvv
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4353 次 |
| 最近记录: |