Laravel Queue Не работает должным образом.Строка вставлена ​​в таблицу, но не предпринята попытка - PullRequest
0 голосов
/ 17 октября 2018

Что я сделал до сих пор:

1) Обновлен драйвер очереди для базы данных в .env

2) Моя функция почтового контроллера выглядит так:

public function sendEmail()
{
   $emailJob = (new SendEmailJob())->delay(Carbon::now()->addSeconds(3));
   dispatch($emailJob);
    exit();
}

3) дескриптор SendEmailJob

public function handle()
{
    Mail::to('mail@gmail.com')->send(new SendMailable());
    echo 'email sent';
}

4) SendMailable Mail имеет следующее

public function build()
{
    return $this->view('emails.ownership');
}

Я хочу отправлять почту практически мгновенно после нажатия на URL.Поскольку я запускаю php artisan queue:listen с задержкой в ​​3 секунды, перед любым действием требуется много времени.Я вижу некоторые данные в таблице заданий с 0 попытками.

Через долгое время появляется следующее сообщение об ошибке в командном окне

   Symfony\Component\Process\Exception\ProcessTimedOutException  : The process ""C:\wamp64\bin\php\php7.2.10\php.exe" "artisan" queue:work  --once --queue="default" --delay=0 --memory=128 --sleep=3 --tries=0" e
xceeded the timeout of 60 seconds.

  at C:\wamp64\www\project\vendor\symfony\process\Process.php:1154
    1150|
    1151|         if (null !== $this->timeout && $this->timeout < microtime(true) - $this->starttime) {
    1152|             $this->stop(0);
    1153|
  > 1154|             throw new ProcessTimedOutException($this, ProcessTimedOutException::TYPE_GENERAL);
    1155|         }
    1156|
    1157|         if (null !== $this->idleTimeout && $this->idleTimeout < microtime(true) - $this->lastOutputTime) {
    1158|             $this->stop(0);

  Exception trace:

  1   Symfony\Component\Process\Process::checkTimeout()
      C:\wamp64\www\project\vendor\symfony\process\Process.php:383

  2   Symfony\Component\Process\Process::wait()
      C:\wamp64\www\project\vendor\symfony\process\Process.php:202

Кстати, почта может быть отправлена ​​напрямую без этой очереди.,Кроме того, обязательно ли запускать очередь php artisan: listen?Как я должен запустить это на сервере без доступа оболочки?

1 Ответ

0 голосов
/ 17 октября 2018
The process exceeded the timeout of 60 seconds

Не удивительно, что для решения этой проблемы вы должны увеличить время ожидания своей работы.Для этого вы можете либо использовать параметр --timeout в команде queue:work, чтобы увеличить время ожидания, чтобы сказать 180 секунд, либо определить переменную в своем классе заданий, например: public $timeout = 180;

С Документы Laravel ,

1.Используйте --timeout

Максимальное количество секунд, которое могут выполняться задания, можно указать с помощью ключа --timeout в командной строке Artisan

2.Используйте $ timeout

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

На другие ваши вопросы:

Это обязательно для запуска phpОчередь ремесленника: прослушать?

Нет

Как мне запустить это на сервере без доступа к оболочке?

Использовать Supervisor или Laravel Horizon (в случае, если вы используете Redis для очереди)

...