Пример использования Yandex Message Queue на Laravel

Для работы с очередями PHP-фреймворк Laravel предоставляет примитив Queue. В качестве брокера сообщений можно использовать Message Queue.

Установка

Установите Laravel по инструкции на официальном сайте фреймворка.

Подготовка к работе

  1. Создайте сервисный аккаунт.
  2. Назначьте роль editor сервисному аккаунту.
  3. Создайте статический ключ доступа.

Задайте переменные окружения:

$ export AWS_ACCESS_KEY_ID="<идентификатор ключа доступа>"
$ export AWS_SECRET_ACCESS_KEY="<секретный ключ>"

Создайте очередь в сервисе Message Queue и скопируйте ее URL.

Инструкции

В этом примере создается демонстрационная задача (Job), которая суммирует два числа, и команда (Command), которая ставит задачу в очередь.

Чтобы использовать Message Queue с Laravel, выполните следующие инструкции.

  1. Создайте тестовый проект ymq_example:

    $ composer create-project --prefer-dist laravel/laravel ymq_example
    
  2. Создайте задачу Add:

    $ php artisan make:job Add
    
  3. Откройте файл /app/Jobs/Add.php и приведите его к виду:

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class Add implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        private $addend1 = null;
        private $addend2 = null;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($addend1, $addend2)
        {
            $this->addend1 = $addend1;
            $this->addend2 = $addend2;
        }
    
        /**
         * Execute the job.
         */
        public function handle()
        {
            $result = $this->addend1 + $this->addend2;
            print("{$this->addend1} + {$this->addend2} = $result\n");
        }
    }
    
  4. Создайте новую команду ScheduleAdd:

    $ php artisan make:command ScheduleAdd
    
  5. Откройте файл app/Console/Commands/ScheduleAdd.php и приведите его к следующему виду:

    <?php
    
    namespace App\Console\Commands;
    
    use App\Jobs\Add;
    
    use Illuminate\Console\Command;
    
    class ScheduleAdd extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'sample:schedule-add';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            Add::dispatch(2, 3);
        }
    }
    
  6. Откройте файл config/queue.php и приведите строку 'default' => env('QUEUE_CONNECTION', 'sync'), к виду 'default' => 'sqs',.

  7. Заполните параметры в блоке sqs.

    Чтобы получить значения для параметров prefix и queue разделить URL вашей очереди на две части: префиксом будет служить https://message-queue.api.cloud.yandex.net/, а параметром очереди b1gvlrnlei4l5idm9cbj/dj6000000000g53305qi без / в начале.

    'sqs' => [
        'driver' => 'sqs',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'prefix' => env('SQS_PREFIX', 'https://message-queue.api.cloud.yandex.net/'),
        'queue' => env('SQS_QUEUE', 'b1gvlrnlei4l5idm9cbj/dj6000000000g53305qi/laravel-test'),
        'region' => env('AWS_DEFAULT_REGION', 'ru-central1'),
    ],
    
  8. Добавьте в зависимости проекта пакет aws/aws-sdk-php:

    $ composer require aws/aws-sdk-php
    
  9. Обновите конфигурацию Composer:

    $ composer update
    
  10. Выполните команду:

    $ php artisan sample:schedule-add
    
  11. Выполните команду:

    $ php artisan queue:work