Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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
Php 如何针对cronjobs中的多个条件并行获取记录_Php - Fatal编程技术网

Php 如何针对cronjobs中的多个条件并行获取记录

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){

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

$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,然后为每个艺术家分配一个单独的作业到作业队列中。根据您的硬件所能容纳的数量,为作业队列分配尽可能多的工作人员。

改进语法。改进语法。