laravel 5.4PHP 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和attempts列被更新的时间。作业完成后,该行(作业)将被删除。
现在,由于某些神秘的原因,有时作业可以无缝地进行工作[[&有时有作业,但是没有指派工人,并且在一秒钟之内该作业被删除。刚刚发生了什么?另外,这是断断续续的,以至于很难跟踪实际尝试过哪些作业,后来又被此问题删除或刚刚删除。
现在至少我已经挠头了一周,请指导我。编辑
-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'] ?? ''));
}
}
这里是日志
[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秒。工作人员正在删除作业,而不是尝试作业。
您可以检查几件事。解决此特定问题后,可能无需执行所有这些操作,但是您可能应该至少使用其中的一个来保持此呼叫的状态。
curl_error()
检查呼叫是否正常;curl_error()
向您显示网络请求和响应的详细信息。这将为您提供很多信息,包括curl_getinfo()
,您可以测试一下它是curl_getinfo()
还是您期望的任何内容;http_response
对其进行记录-请对其进行记录。如果响应中包含某种成功/失败元素,请对其进行测试,确保它符合您的期望;例如(如前所述,您通常不会做所有这些事情,只选择适合您的情况):
200