Событие очереди Laravel выполняется непосредственно перед полной загрузкой страницы

Я добавляю задание в очередь на контроллере загрузки страницы, вызываю событие laravel и транслирую его через сокет io во внешний интерфейс. Проблема в том, что поскольку это выполняется при загрузке страницы, задание выполняется до полной загрузки страницы. В результате я вижу, что ответ добавляется на короткое время, пока страница загружается, и исчезает, когда она полностью загружена. Почему это так?

  1. Сомневался, синхронизируется ли соединение вместо redis. После проверки .env и config / queue.php по умолчанию использует redis.

  2. DispatchNow работает нормально, а отправка - нет. Это из-за этого ответ был отправлен непосредственно перед тем, как страница успокоилась?

  3. Во внешнем интерфейсе я добавил код для подключения к сокету внутри документа, чтобы убедиться, что это будет сделано после загрузки dom. Но не помогает, ведет себя так же.

  4. Я пробовал другой обходной путь, при котором я запускаю ajax-вызов задания очереди, когда виден конкретный элемент DOM, и он отлично работает.

Но я хочу, чтобы он вызывался на самом контроллере страницы, а не на отдельном ajax.

In controller:

 $sellings = curl(...some call to external url);

 SendOrder::dispatchNow($sellings, Auth::id());

 return view('home');

In SendOrder job:

public function handle()
    {

        // Allow only 2 emails every 1 second
        Redis::throttle('any_key')->allow(2)->every(1)->then(function () {

            event(new DashboardEvent('job1', $this->order, $this->user));
           Log::info('job 1done');

        }, function () {
            // Could not obtain lock; this job will be re-queued
            return $this->release(2);
        });

    }

.env:

BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis

config/queue.php

'default' => env('QUEUE_CONNECTION', 'redis'),
........
.........
'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => env('REDIS_QUEUE', 'default'),
            'retry_after' => 90,
            'block_for' => null,
        ],
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
78
1

Ответы 1

Вы можете просто отложить отправку с помощью чего-то вроде:

SendOrder::dispatch()->delay(now()->addMinutes(1))

Кроме того, если вы хотите отправить задание после того, как ответ будет отправлен обратно клиенту, вы также можете использовать метод dispatchAfterResponse().

Этот метод запускает задание после отправки ответа, но до закрытия соединения. Он просто регистрирует завершающий обратный вызов, который приложение запускает до того, как оно выполнит запрос.

Однако это полезно только для немедленной отправки короткого задания, а не для отправки его в систему очередей. Поскольку отправка электронных писем - не такая уж и короткая работа, это может быть не для вас.

Другие вопросы по теме