如何实现异步队列在Symfony 3中运行Method

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轻松完成的事情.关于你为什么要选择它的几句话:

  • 它支持从最简单的(文件系统)到企业(RabbitMQ或Amazon SQS)的大量传输.
  • 它配备了一个非常强大的捆绑.
  • 它具有顶级抽象,可以最轻松地使用.
  • 还有更多可能派上用场的东西.

关于你的问题.以下是使用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)