romach3 / SimpleQueue

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SimpleQueue

Установка

  • Клонируйте репозиторий и выполните composer install
  • Установите Beanstalkd
  • Запустите команду ./queue listen TUBE_NAME в фоне.
  • Выполните команду ./queue test, она стартует задачу, которая добавит в лог App/Logs/SimpleQueueTube.log строку "Yeah!"

Окружение

Beanstalkd

sudo apt-get install beanstalkd

Сервер очередей, вокруг которого всё и крутится.

beanstalkd - сервер

pda/pheanstalk - php-пакет для работы с ним

Supervisor

sudo apt-get install supervisor

Пригодится для поддержания queue:listen в запущенном состоянии (можно и без него, но так будет гарантия, что ничего не отвалится от долгой работы).

Пример конфига:

[program:simple]
directory=/sites/SimpleQueue
autorestart=true
redirect_stderr=true
command=./queue listen tube
stdout_logfile=/sites/SimpleQueue/App/Logs/listen.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB

Конфиги складываются в каталог /etc/supervisor/conf.d

После их обновления необходимо выполнить команды:

  • supervisorctl update что бы перечитать конфигурацию.
  • supervisorctl restart simple

supervisord.org

Использование

Структура проекта

  • App - тут должны находиться файлы приложения: задачи и то что их стартует, передавая необходимые данные.
  • App/Jobs - каталог для задач
  • App/Logs - логи выполнения задач
  • Kernel - файлы SimpleQueue
  • public/job.php - добавление задач через HTTP.

Добавление задачи через PHP

Просто создайте тем или иным путем новый экземпляр класса Push, передав в конструктор параметры.

use Kernel\Queue\Push;
new Push('SimpleQueueTube', 'SimpleJob', 'Yeah!');

Добавляет задачу в очередь SimpleQueueTube. При выполнени создается объект класса SimpleJob и ему будут переданы данные "Yeah!". В качестве данных может быть передано все что поддается сериализации средствами PHP.

Прим.: следует учитывать, не все что сериализуется можно сериализовать. К примеру модель в ORM, которая хранит в себе текущее состояние записи в БД: ко времени выполнения задачи оно возможно уже изменится.

Прим.: по умолчанию, если имя класса не начинается с , подставляется неймспейс \App\Jobs.

Добавление задачи через HTTP

Для начала необходимо настроить ваш сервер так, что бы public стал корневым каталогом сайта.

Затем необходимо разрешить задачи в файле настроек App/http.php:

<?php return [
    'jobs' => [
        'simple-job' => [ // Название задачи
            'class' => 'SimpleJob', // Класс задачи
            'parameters' => true, // Принимать ли параметры
            'data' => 'Yeah!', // Параметры передаваемые в задачу
        ]
    ],
    'tubes' => ['SimpleQueueTube'] // Список разрешенных очередей,
    'auth' => function() { // Любая форма авторизации
            return false; // Добавление задачи запрещено.
        }
];

Затем задачу можно будет добавить в очередь выполнив запрос по адресу:

http://example.com/job.php?tube=SimpleQueueTube&job=simple-job&another_data=value

tube и job указывают на название задачи и очереди, всё остальное уйдет в данные, если это разрешено (parameters).

Прим.: входящий запрос проверяется только на разрешенность для выполнения очереди и задачи!

Прим.: если parameters === false, то данные из data будут переданы в том виде что есть, во всех остальных случаях в задачу будет передан массив. Соответственно, если parameters === true, а data массивом не является, то она будет в него преобразована методом $data = [$data], что бы объеденить с данными из запроса и станет нулевым элементом.

Прим.: auth может быть чем угодно, важно что бы функция вернула true/false.

Задачи

Все задачи должны наследоваться от Kernel\Queue\JobAbstract и при возможности распологаться по неймспейсу (и пути для удобства) \App\Jobs. Данные переданные при добавлении задачи будут находится в свойстве объекта data, метод $this->log('string or array strings') добавляет записи в лог очереди.

Сама же задача стартуется методом ->start().

<?php namespace App\Jobs;
   
use Kernel\Queue\JobAbstract;
   
class SimpleJob extends JobAbstract {

    public function start() {
        /* Любые необходимые действия */
        $this->log($this->data);
    }

}

Потоки

SimpleQueue умеет работать с несколькими очередями одновременно, запуская асинхронно по одной задаче из каждой очереди и дожидаясь её окончания перед запуском новой. Но что если необходимо в одной очереди выполнять сразу несколько задач? К примеру, отправка писем при рассылке, где обработка по одному может затянуться на долгое время?

В config.php задайте параметр thread.enabled = true, установите количество потоков (threads) и перечислите очереди, к которым эти настройки будут применены (tubes). SimpleQueue создаст дополнительные очереди вида tube___x, где x - номер потока и будет их обрабатывать по отдельности.

Логи

Логи находятся в каталоге App/Logs.

About


Languages

Language:PHP 100.0%