如何在cronjobs中为多个条件并行获取记录

时间:2017-04-14 10:00:34

标签: php

我有一个包含许多艺术家的音乐库应用。我想使用多个cronjobs并行获取多个艺术家的记录。我正在尝试使用以下代码:

$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending'])->limit(250);
$tracks = $track_q->all();
/*** using that artists ***/
foreach($tracks as $track){
    $artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
    $artist=$artist_q->first();
}

但它一次只能吸引一位艺术家。我想在平行的cronjobs中取出多个这样的艺术家:

对于cronjob one:

$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending', 'artist_id IN'=>[1,2,3,4,5]])->limit(250);
$tracks = $track_q->all();
//$track->artist_id; die;
foreach($tracks as $track){
$artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
$artist=$artist_q->first();

对于cronjob二:

/*** get records for artists having id 1,2,3,4,5 ***/
$track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending', 'artist_id IN'=>[6,7,8,9,10]])->limit(250);
$tracks = $track_q->all();
/*** using that artists ***/
foreach($tracks as $track){
    $artist_q=$this->DbArtists->find()->where(["id"=>$track->artist_id]);
    $artist=$artist_q->first();
}

问题是有1000名艺术家,所以如何在不指定硬编码ID的情况下如上所述管理它们?

1 个答案:

答案 0 :(得分:0)

您可以在%列上使用模artist_id运算符。

假设您正在使用Laravel的Eloquent查询构建器,那么以下内容应该有效:

->whereRaw('artist_id % 2 = 0')->limit(250);  // All even artist_ids

......在第二个cron工作中:

->whereRaw('artist_id % 2 = 1')->limit(250);  // All odd artist_ids

有关模运算符的说明:

x % 2表示 x除以2 的余数。因此,当 x%2 = 0 时,x必须是偶数。同样,当 x%2 = 1 时,x必须是奇数。

您可以将同一示例扩展到任意数量的子集。如果要分配 n 单独的集合,只需使用 artist_id%n == x ,其中 x 可以是0到之间的任何整数n-1个

修改

只要artist_id是数字,上述内容才有效。

一般注意事项:

我不知道你的cron工作究竟与所有艺术家有什么关系,但这可能是另一种方法:使用cronjob只查询所有艺术家的ID然后再发送一个单独的每个艺术家的工作进入工作队列。根据需要为作业队列分配多个工作人员,并且硬件可以支持。