Php 如何针对cronjobs中的多个条件并行获取记录
我有一个包含许多艺术家的音乐库应用程序。我想使用多个CronJob并行获取多个艺术家的记录。我正在尝试使用以下代码:Php 如何针对cronjobs中的多个条件并行获取记录,php,Php,我有一个包含许多艺术家的音乐库应用程序。我想使用多个CronJob并行获取多个艺术家的记录。我正在尝试使用以下代码: $track_q = $this->DbTracks->find()->where(["enrich_status"=>'pending'])->limit(250); $tracks = $track_q->all(); /*** using that artists ***/ foreach($tracks as $track){
$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();
}
但它一次只能吸引一位艺术家。我想让多个艺术家同时做这样的工作:
对于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();
对于作业二:
/*** 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的情况下按上述方式批量管理他们?您可以在
艺术家id
列上使用modulo%
运算符
假设您使用的是Laravel的雄辩的查询生成器,下面的内容应该可以使用:
->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,然后为每个艺术家分配一个单独的作业到作业队列中。根据您的硬件所能容纳的数量,为作业队列分配尽可能多的工人。您可以在
艺术家id
列上使用modulo%
运算符
假设您使用的是Laravel的雄辩的查询生成器,下面的内容应该可以使用:
->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,然后为每个艺术家分配一个单独的作业到作业队列中。根据您的硬件所能容纳的数量,为作业队列分配尽可能多的工作人员。改进语法。改进语法。