Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Laravel 5和Redis检查作业是否已在队列中_Redis_Queue_Laravel 5_Jobs - Fatal编程技术网

使用Laravel 5和Redis检查作业是否已在队列中

使用Laravel 5和Redis检查作业是否已在队列中,redis,queue,laravel-5,jobs,Redis,Queue,Laravel 5,Jobs,几天前我实现了一个作业队列,我遇到了复制问题,我目前正在使用Redis,并遵循Laravel的官方教程 在我的例子中,每当有人进入主页时,都会向队列发送一个作业,让我们举一个例子: 家庭控制器的索引(): 由于此任务大约需要10秒才能完成,因此,如果在处理任务时有n个对我的主页的请求,则队列中将有n个以上的相同作业,从而在我的数据库中产生意外结果 所以我的问题是,有没有办法知道某个工作是否已经排在队列中了?我知道这是一个老问题,但我发现自己从谷歌一次又一次地回到这里,所以我想给它一个答案。我想用

几天前我实现了一个作业队列,我遇到了复制问题,我目前正在使用Redis,并遵循Laravel的官方教程

在我的例子中,每当有人进入主页时,都会向队列发送一个作业,让我们举一个例子:

家庭控制器的
索引()

由于此任务大约需要10秒才能完成,因此,如果在处理任务时有n个对我的主页的请求,则队列中将有n个以上的相同作业,从而在我的数据库中产生意外结果


所以我的问题是,有没有办法知道某个工作是否已经排在队列中了?

我知道这是一个老问题,但我发现自己从谷歌一次又一次地回到这里,所以我想给它一个答案。我想用一种简单的方法在仪表板上查看我的Laravel应用程序中队列中的作业,并使用了以下代码

$thejobs=array();
//获取队列上的作业数
$numJobs=Redis::connection()->llen('queues:default');
//在这里,我们为最多1000个作业选择详细信息
$jobs=Redis::connection()->lrange('queues:default',0,1000);
//我想清理一下数据
//您可以使用var_dump查看在此之前的情况
//var_dump(工作);
foreach($jobs作为$job){
//这里的每个作业都是json格式的,因此解码为对象形式
$tmpdata=json_decode($job);
$data=$tmpdata->data;
//我只想得到这个命令,所以我一开始就去掉了App\Jobs
$command=$this->get_string_-between($data->command,“'App\Jobs\\”,“'”);
$id=$tmpdata->id;
//可以很好地看到尝试的次数
$attempts=$tmpdata->attempts;
$thejobs[]=array($command,$id,$attempts);
}
//现在,您可以使用数据并对其进行比较,或者检查您的作业是否已在队列中
我不建议这样做,尤其是在页面加载时,比如像op那样的索引页面。如果您需要使用此代码来检查作业是否正在运行,则最有可能需要重新思考您的工作方式


答案特定于运行Redis的队列。

您可以在jobs handle函数中执行此操作,如果安排了另一个相同的作业,则可以跳过工作

public function handle()
{
    $queue = \DB::table(config('queue.connections.database.table'))->orderBy('id')->get();
    foreach ($queue as $job){
        $payload = json_decode($job->payload,true);
        if($payload['displayName'] == self::class && $job->attempts == 0){
            // same job in queue, skip
            return ;
        }
    }

    // do the work
}

任何想知道为什么的人

Queue::size('queueName');
它的大小和我的不一样

Redis::llen('queues:queueName'); 这是因为Laravel使用3条记录来计算队列的大小,因此,如果您想获得队列中作业的真实数量,必须执行以下操作:

Redis::lrange('queues:queueName',0,-1);
Redis::zrange('queues:queueName:delayed',0,-1);
Redis::zrange('queues:queueName:reserved',0,-1);

现在,您可以评估所需的输入是否在这些队列中,并根据这些队列采取行动。

我知道这是一个非常古老的问题,但我将为未来的谷歌用户回答这个问题

由于Laravel 8有“独特的工作”功能-

public function handle()
{
    $queue = \DB::table(config('queue.connections.database.table'))->orderBy('id')->get();
    foreach ($queue as $job){
        $payload = json_decode($job->payload,true);
        if($payload['displayName'] == self::class && $job->attempts == 0){
            // same job in queue, skip
            return ;
        }
    }

    // do the work
}