0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Чтобы<strong>работать с очередями в Laravel</strong>, достаточно знать и уметь выполнять несколько команд.</p>
1
<p>Чтобы<strong>работать с очередями в Laravel</strong>, достаточно знать и уметь выполнять несколько команд.</p>
2
<p>1 -<strong>Создать</strong>обработчик очереди:</p>
2
<p>1 -<strong>Создать</strong>обработчик очереди:</p>
3
$ php artisan make:job ProcessSendingEmail<p>2 -<strong>Отправить</strong>новое событие в очередь:</p>
3
$ php artisan make:job ProcessSendingEmail<p>2 -<strong>Отправить</strong>новое событие в очередь:</p>
4
ProcessSendingEmail::dispatch($user);<p>3 -<strong>И запустить</strong>обработчик всех событий:</p>
4
ProcessSendingEmail::dispatch($user);<p>3 -<strong>И запустить</strong>обработчик всех событий:</p>
5
<h2>Максимально просто, правда?</h2>
5
<h2>Максимально просто, правда?</h2>
6
<p>Давайте теперь рассмотрим немного подробнее наши очереди: что это вообще такое и зачем они нужны. Согласно википедии, очередью (англ. - queue) называется<strong>структура данных</strong>, из которой удаляется первым тот элемент, который был первым добавлен в очередь. То есть<strong>очередь в программировании</strong>соответствует "бытовому" понятию очереди. И выглядит очередь примерно так:</p>
6
<p>Давайте теперь рассмотрим немного подробнее наши очереди: что это вообще такое и зачем они нужны. Согласно википедии, очередью (англ. - queue) называется<strong>структура данных</strong>, из которой удаляется первым тот элемент, который был первым добавлен в очередь. То есть<strong>очередь в программировании</strong>соответствует "бытовому" понятию очереди. И выглядит очередь примерно так:</p>
7
<p>Мы добавляем новые объекты в конец очереди, а обрабатываем их с самого начала (<strong>принцип FIFO</strong>- first in, first out), точно так же, как и с людьми, только со строгим порядком.</p>
7
<p>Мы добавляем новые объекты в конец очереди, а обрабатываем их с самого начала (<strong>принцип FIFO</strong>- first in, first out), точно так же, как и с людьми, только со строгим порядком.</p>
8
<h2>Зачем нужны очереди?</h2>
8
<h2>Зачем нужны очереди?</h2>
9
<p>В целом они позволяют обеспечить<strong>асинхронное выполнение участков программы</strong>, что в свою очередь даёт возможность: -<strong>увеличить скорость работы приложения</strong>- выносим времязатратный и ресурсоемкий код в очередь, и пользователи наслаждаются быстрым ответом от сервера, а все сложные задачи выполняются в фоне; -<strong>обслуживать большее количество посетителей</strong>- продолжение предыдущего пункта, увеличиваем количество обработчиков - обрабатываем большее количество запросов; -<strong>использовать разные языки разработки</strong>в одном приложении - да-да, сложные операции можно писать на python, node и даже на С!</p>
9
<p>В целом они позволяют обеспечить<strong>асинхронное выполнение участков программы</strong>, что в свою очередь даёт возможность: -<strong>увеличить скорость работы приложения</strong>- выносим времязатратный и ресурсоемкий код в очередь, и пользователи наслаждаются быстрым ответом от сервера, а все сложные задачи выполняются в фоне; -<strong>обслуживать большее количество посетителей</strong>- продолжение предыдущего пункта, увеличиваем количество обработчиков - обрабатываем большее количество запросов; -<strong>использовать разные языки разработки</strong>в одном приложении - да-да, сложные операции можно писать на python, node и даже на С!</p>
10
<h2>Принцип работы</h2>
10
<h2>Принцип работы</h2>
11
<p>И коротко расскажу вам о принципе работы системы очередей. Она состоит из двух основных компонентов: 1.<strong>сервера очередей</strong>, 2.<strong>обработчика</strong>.</p>
11
<p>И коротко расскажу вам о принципе работы системы очередей. Она состоит из двух основных компонентов: 1.<strong>сервера очередей</strong>, 2.<strong>обработчика</strong>.</p>
12
<p>Сервер очереди хранит список сообщений (или задач,<strong>job queue</strong>), которые отправляет ему основное приложение. Задача - это просто информация о том, что и как нужно выполнить.</p>
12
<p>Сервер очереди хранит список сообщений (или задач,<strong>job queue</strong>), которые отправляет ему основное приложение. Задача - это просто информация о том, что и как нужно выполнить.</p>
13
<p>Обработчик (или<strong>worker</strong>) - это часть основной программы, которая работает с очередью в обратном направлении. Он получает новые сообщения из очереди и выполняет соответствующие действия.</p>
13
<p>Обработчик (или<strong>worker</strong>) - это часть основной программы, которая работает с очередью в обратном направлении. Он получает новые сообщения из очереди и выполняет соответствующие действия.</p>
14
<h2>Пример</h2>
14
<h2>Пример</h2>
15
<p>Представим себе простую форму регистрации с одним полем для email и кнопкой "Зарегистрироваться". По нажатию на кнопку отправляем данные на сервер и проверяем, есть ли у нас пользователь с таким email в базе или нет, если есть - отправим сообщение на форму, что пользователь уже существует, а если нет - отправим ему на указанную почту email для его подтверждения. Для отправки email у нас есть 2 варианта: 1. отправить синхронно в рамках одного запроса, 2. добавить задачу об отправке email в очередь.</p>
15
<p>Представим себе простую форму регистрации с одним полем для email и кнопкой "Зарегистрироваться". По нажатию на кнопку отправляем данные на сервер и проверяем, есть ли у нас пользователь с таким email в базе или нет, если есть - отправим сообщение на форму, что пользователь уже существует, а если нет - отправим ему на указанную почту email для его подтверждения. Для отправки email у нас есть 2 варианта: 1. отправить синхронно в рамках одного запроса, 2. добавить задачу об отправке email в очередь.</p>
16
<p>И на самом деле правильного ответа нет, нужно смотреть на конкретную ситуацию. Если у вас небольшой проект, у вас регистрируется несколько человек в час и некритично, если они ждут по 5-10 секунд (а то и все 30) обработки запроса, то первый вариант с синхронной отправкой письма вам подходит. Но в большинстве случаев лучше использовать очередь. Для этого вернемся к началу статьи и выполним пару простых шагов:</p>
16
<p>И на самом деле правильного ответа нет, нужно смотреть на конкретную ситуацию. Если у вас небольшой проект, у вас регистрируется несколько человек в час и некритично, если они ждут по 5-10 секунд (а то и все 30) обработки запроса, то первый вариант с синхронной отправкой письма вам подходит. Но в большинстве случаев лучше использовать очередь. Для этого вернемся к началу статьи и выполним пару простых шагов:</p>
17
<p>1)<strong>Создать</strong>обработчик очереди:</p>
17
<p>1)<strong>Создать</strong>обработчик очереди:</p>
18
$ php artisan make:job ProcessSendingEmail<p>Все обработчики по умолчанию создаются в app/Jobs. Открываем созданный файл app/Jobs/ProcessSendingEmail.php и обновляем функцию handle:</p>
18
$ php artisan make:job ProcessSendingEmail<p>Все обработчики по умолчанию создаются в app/Jobs. Открываем созданный файл app/Jobs/ProcessSendingEmail.php и обновляем функцию handle:</p>
19
public function handle(User $user) { Mail::send('mail.confirm-registration', [ 'html' => 'Ура! Подтверди свой email по ссылке - https://example.com' ], function ($message) use ($user) { $message->to($user->email)->subject('Подтверждение регистрации’); }); }<p>Сейчас наш обработчик получает модель пользователя и отсылает ему письмо с помощью стандартного пакета Mail в Laravel, с его возможностями можете ознакомиться в<a>документации</a>.</p>
19
public function handle(User $user) { Mail::send('mail.confirm-registration', [ 'html' => 'Ура! Подтверди свой email по ссылке - https://example.com' ], function ($message) use ($user) { $message->to($user->email)->subject('Подтверждение регистрации’); }); }<p>Сейчас наш обработчик получает модель пользователя и отсылает ему письмо с помощью стандартного пакета Mail в Laravel, с его возможностями можете ознакомиться в<a>документации</a>.</p>
20
<p>2)<strong>Отправить</strong>новое событие в очередь:</p>
20
<p>2)<strong>Отправить</strong>новое событие в очередь:</p>
21
ProcessSendingEmail::dispatch($podcast); public function register(Request $request) { // .... code ProcessSendingEmail::dispatch($user); // .... code }<p>После вызова функции dispatch новое событие тут же улетит в нашу очередь, а нам лишь остаётся запустить обработчик нашей очереди и ждать, когда письмо отправится пользователю.</p>
21
ProcessSendingEmail::dispatch($podcast); public function register(Request $request) { // .... code ProcessSendingEmail::dispatch($user); // .... code }<p>После вызова функции dispatch новое событие тут же улетит в нашу очередь, а нам лишь остаётся запустить обработчик нашей очереди и ждать, когда письмо отправится пользователю.</p>
22
<p>3)<strong>Запускаем</strong>обработчик всех событий в консоли командой:</p>
22
<p>3)<strong>Запускаем</strong>обработчик всех событий в консоли командой:</p>
23
<p>После запуска обработчика все наши события будут поочередно обрабатываться, и если у нас в очереди было 100 писем на отправку, то последнее письмо явно отправится не скоро и будет примерно, как на первой картинке, когда все ждут в очереди. Это примерно так же, когда в магазине толпа людей, а работает только одна касса.</p>
23
<p>После запуска обработчика все наши события будут поочередно обрабатываться, и если у нас в очереди было 100 писем на отправку, то последнее письмо явно отправится не скоро и будет примерно, как на первой картинке, когда все ждут в очереди. Это примерно так же, когда в магазине толпа людей, а работает только одна касса.</p>
24
<p>К счастью, нам не нужно платить кассирам и мы можем очень легко решить эту проблему, открыв 100 касс, точнее<strong>запустив 100 обработчиков</strong>, и наши письма будут отправятся параллельно. Безусловно, надо быть аккуратным с выбором количества обработчиков, ведь каждый будет занимать ресурсы нашего сервера и оптимальное число нужно подбирать из наших возможностей, но помним<strong>чем больше обработчиков - тем быстрее все наши сообщения будут обрабатываться</strong>.</p>
24
<p>К счастью, нам не нужно платить кассирам и мы можем очень легко решить эту проблему, открыв 100 касс, точнее<strong>запустив 100 обработчиков</strong>, и наши письма будут отправятся параллельно. Безусловно, надо быть аккуратным с выбором количества обработчиков, ведь каждый будет занимать ресурсы нашего сервера и оптимальное число нужно подбирать из наших возможностей, но помним<strong>чем больше обработчиков - тем быстрее все наши сообщения будут обрабатываться</strong>.</p>
25
<h2>Итог</h2>
25
<h2>Итог</h2>
26
<p>В целом использование очередей сильно ускоряет работу вашего приложения и при этом их очень<strong>просто использовать</strong>, достаточно выполнить 3 простых шага: создать обработчик, вызвать его в нужном месте и запустить воркер. Звучит просто,<strong>на практике тоже легко</strong>, поэтому не бойтесь использовать их в своем приложении!</p>
26
<p>В целом использование очередей сильно ускоряет работу вашего приложения и при этом их очень<strong>просто использовать</strong>, достаточно выполнить 3 простых шага: создать обработчик, вызвать его в нужном месте и запустить воркер. Звучит просто,<strong>на практике тоже легко</strong>, поэтому не бойтесь использовать их в своем приложении!</p>
27
<h3>Материалы</h3>
27
<h3>Материалы</h3>
28
<ol><li>https://laravel.com/docs/5.8/queues</li>
28
<ol><li>https://laravel.com/docs/5.8/queues</li>
29
<li>https://laravel.com/docs/5.8/mail</li>
29
<li>https://laravel.com/docs/5.8/mail</li>
30
<li>https://ruhighload.com/Очереди+сообщений</li>
30
<li>https://ruhighload.com/Очереди+сообщений</li>
31
<li>https://laravel.ru/docs/v5/queues</li>
31
<li>https://laravel.ru/docs/v5/queues</li>
32
</ol>
32
</ol>