- Клонируйте репозиторий и выполните
composer install
- Установите Beanstalkd
- Запустите команду
./queue listen TUBE_NAME
в фоне. - Выполните команду
./queue test
, она стартует задачу, которая добавит в логApp/Logs/SimpleQueueTube.log
строку "Yeah!"
sudo apt-get install beanstalkd
Сервер очередей, вокруг которого всё и крутится.
beanstalkd - сервер
pda/pheanstalk - php-пакет для работы с ним
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
- App - тут должны находиться файлы приложения: задачи и то что их стартует, передавая необходимые данные.
- App/Jobs - каталог для задач
- App/Logs - логи выполнения задач
- Kernel - файлы SimpleQueue
- public/job.php - добавление задач через HTTP.
Просто создайте тем или иным путем новый экземпляр класса Push, передав в конструктор параметры.
use Kernel\Queue\Push;
new Push('SimpleQueueTube', 'SimpleJob', 'Yeah!');
Добавляет задачу в очередь SimpleQueueTube. При выполнени создается объект класса SimpleJob и ему будут переданы данные "Yeah!". В качестве данных может быть передано все что поддается сериализации средствами PHP.
Прим.: следует учитывать, не все что сериализуется можно сериализовать. К примеру модель в ORM, которая хранит в себе текущее состояние записи в БД: ко времени выполнения задачи оно возможно уже изменится.
Прим.: по умолчанию, если имя класса не начинается с , подставляется неймспейс \App\Jobs.
Для начала необходимо настроить ваш сервер так, что бы 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
.