Прежде всего, я знаю об очередях и теперь имею хороший опыт работы с очередями. Проблема с очередью в том, что это очередь. Я хочу выполнять несколько функций или команд вместе в фоновом режиме. Очереди сохранят вторую команду или функцию в очереди и будут выполнены, как только будет выполнена первая из них!
Например, у меня есть таблица с ~ 3 000 000 записей, и я хочу обработать их быстрее. Что я могу сделать, так это разделить их на 5 равных блоков и выполнить 5 команд, чтобы я мог использовать свой ЦП и обрабатывать данные в 5 раз быстрее.
Итак, как я могу сделать это с Laravel? Очереди не будут работать, потому что они выполняют вещи один за другим. Если ваша идея состоит в том, чтобы создать несколько 5 множественных очередей и супервизоров для выполнения, я думаю, что это не стандартный способ сделать это.
Любая идея о том, что можно сделать в этом случае?
Просто чтобы добавить кое-что из моего личного опыта.
Первый установить и настроить соответственно, для вашей операционной системы, ниже приведены настройки для ОС Linux на базе Linux, например, Ubuntu
Конфиденциальность: (/etc/supervisor/conf.d)
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/app/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
user=username
numprocs=25
redirect_stderr=true
stderr_events_enabled=true
stderr_logfile=/var/www/app/storage/logs/worker.error.log
stdout_logfile=/var/www/app/storage/logs/worker.log
Затем создайте работы в соответствии с вашими потребностями и отправка.
Супервизор будет обрабатывать задания одновременно, в этом конкретном случае 25
задания будут обрабатываться одновременно.
Наконец-то я нашел решение. Это очень очень легко. Итак, вот как это работает.
Прежде всего, я делю записи на количество блоков (например, 5 блоков. Это разделит 3 миллиона элементов на 5 блоков по 600 тысяч элементов в каждом)
Затем я могу отправить команду в очереди, которые я мгновенно создаю для чанков, и выполнить работника очереди для этой очереди только один раз, используя --once
вариант. Чтобы было проще понять, вот код, который я использую.
$chunk_id = 0;
foreach($chunks as $chunk){
// Adding chunk to queue
Artisan::queue('process:items',[
'items' => $chunk,
])->onQueue('processChunk'.$chunk_id);
// Executing queue worker only once
exec('php artisan queue:work --queue=processChunk'.$chunk_id.' --once > storage/logs/process.log &');
$chunk_id++;
}
С exec
Команда, мы выполняем работника очереди для определенной очереди, созданной для определенного чанка. Также мы добавили &
в конце команды, которая заставляет команду выполняться в фоновом режиме на уровне ОС.
Вот как это можно сделать. Я проверял это, и это работает гладко! Что-то еще, чтобы улучшить или есть какие-либо недостатки использования этого метода?