HTML Diff
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' =&gt; 'Ура! Подтверди свой email по ссылке - https://example.com' ], function ($message) use ($user) { $message-&gt;to($user-&gt;email)-&gt;subject('Подтверждение регистрации’); }); }<p>Сейчас наш обработчик получает модель пользователя и отсылает ему письмо с помощью стандартного пакета Mail в Laravel, с его возможностями можете ознакомиться в<a>документации</a>.</p>
19 public function handle(User $user) { Mail::send('mail.confirm-registration', [ 'html' =&gt; 'Ура! Подтверди свой email по ссылке - https://example.com' ], function ($message) use ($user) { $message-&gt;to($user-&gt;email)-&gt;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>