laravel 5.4
php 7.1.32
руководитель 3.3.1
(я знаю ... Я знаю. Компания работает на 3 года позже)
config / queue. php
'database' => [
'driver' => 'database',
'connection' => 'queue', // means in config/database.php I have to setup a new connection
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
конфигурации супервизора
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/project/artisan queue:work
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/project/storage/logs/supervisord.log
SCENARIO : при отправке очереди в таблицу jobs добавляется новая строка. Затем для работы назначается Laravel Worker , тогда обновляются столбцы reserved_at & попытки . После завершения задания строка (задание) удаляется.
Теперь, по некоторым мистическим причинам, иногда задание работает без сбоев и иногда задание есть, но ни один работник не назначается ему и в пределах долю секунды, что работа удаляется. Что только что произошло? Кроме того, это настолько непостоянно, что трудно отследить, какие задания были на самом деле предприняты, а затем удалены или просто удалены из-за этой проблемы.
Я почесал свою голову, по крайней мере, неделю, пожалуйста, помогите мне.
Редактировать
- php artisan queue:restart
широковещательная рассылка, супервизор обновляется с обновлением, но без улучшения проблемы.
- Позже я удалил супервизор и попытался выполнить ручным способом php artisan queue:work
и даже то, что удалил задание вместо его попытки (новые данные также не были вставлены в failed_jobs).
Редактировать ( 2) - Журналы
Вот функция, которую отправляет задание
public static function sendVoiceCall($instituteSmsSettings, $announcementId, $postUrl, $mobileNumbers)
{
Log::debug('Job dispatched');
dispatch(new SendVoiceCall($instituteSmsSettings, $announcementId, $postUrl, $mobileNumbers));
}
Вот Задание
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Log;
class SendVoiceCall implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3;
protected $ARR_POST_DATA = array();
protected $postUrl = '';
public function __construct($instituteSmsSettings, $announcementId, $postUrl, $mobileNumbers)
{
$this->ARR_POST_DATA['username'] = $instituteSmsSettings->username;
$this->ARR_POST_DATA['token'] = $instituteSmsSettings->token;
$this->ARR_POST_DATA['announcement_id'] = $announcementId;
$this->ARR_POST_DATA['plan_id'] = $instituteSmsSettings->plan_id;
$this->ARR_POST_DATA['caller_id'] = $instituteSmsSettings->caller_id;
$this->ARR_POST_DATA['contact_numbers'] = $mobileNumbers;
$this->postUrl = $postUrl;
}
public function handle()
{
Log::debug('Job started');
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $this->postUrl);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($this->ARR_POST_DATA));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$sendCallResponse = curl_exec($curl);
$curlResponse = json_decode($sendCallResponse, true);
curl_close($curl);
Log::info('Queue complete. Announcement Id: ' . ($this->ARR_POST_DATA['announcement_id'] ?? ''));
}
}
Вот Log
[2020-04-13 10:17:49] production.DEBUG: Job dispatched
[2020-04-13 10:17:50] production.DEBUG: Job started
[2020-04-13 10:17:50] production.INFO: Queue complete. Announcement Id: 203691
Как вы можете видеть, очередь начиналась и заканчивалась в одно и то же время (разница должна была составлять 2-3 se c. работник удаляет задание, а не пытается его .