This is something you can easily do with a queue package . A few words about why you should choose:
- It supports many transports from the simplest (file system) to corporate (RabbitMQ or Amazon SQS).
- It comes with a very powerful bundle .
- It has a top-level abstraction that can be used with maximum ease.
- There are many more that may come in handy.
Regarding your question. Here you can do this with a queue package. Follow the installation instructions from the document .
addUserLTV :
<?php
namespace Acme;
use Enqueue\Client\ProducerInterface;
class AddUserLTVService
{
private $producer;
public function __construct(ProducerInterface $producer)
{
$this->producer = $producer;
}
public function addUserLTV( $userID, $addLTV )
{
$this->producer->sendCommand('add_user_ltv', [
'userId' => $userID,
'ltv' => $addLTV]
);
}
}
( , ). Symfony:
services:
Acme\AddUserLTVService:
arguments: ['@enqueue.producer']
. , :
<?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'];
return self::ACK;
}
public static function getSubscribedCommand()
{
return 'add_user_ltv';
}
}
enqueue.client.processor:
services:
Acme\AddUserTVAProcessor:
tags:
- {name: 'enqueue.client.processor'}
. , :
./bin/console enqueue:consume --setup-broker -vvv