我正在创建一个批处理过程,该过程定期从数据库中删除大量不必要的数据。
出于性能原因,我没有使用任何ORM,我只是:
- 在一个查询中从数据库获取所选记录的主键,以及
- 在下一个查询中删除它们
问题是,有时确实有数百万条记录需要删除。因此,我想以每个查询1000个关键字(delete from foo where id in(...)
)的形式删除它们。
我试过这个:
$chunkSize = 1000;
$ids = $mapper->getIdsForFoo(); //getting ids from db
$idsCount = count($ids);
if($idsCount && $ids != false){
$chunks = ceil($idsCount / $chunkSize); //calculating chunks quantity
$chunksArr = array();
//if there's more than 1000 ids, split them
if($chunks > 1){
for($i = 0; $i <= $chunks; $i++){
$currentOffset = $i * $chunkSize;
$chunks[] = 'array_slice($idsCount, $currentOffset, $chunkSize);
}
}
else{
$chunksArr[] = $ids;
}
//deleting ids code here
}
不幸的是,我得到的结果是
PHP Warning: Cannot use a scalar value as an array
首先我想那是因为我在array_slice()
中做了乘法
$chunks[] = 'array_slice($ids, $i * $chunkSize, $chunkSize);
但我提取它来分离变量
$currentOffset = $i * $chunkSize;
$chunks[] = 'array_slice($ids, $currentOffset, $chunkSize);
但我还是犯了同样的错误。
为什么不使用array_chunk?它正是你想做的:
$chunks = array_chunk($ids, 1000);
如果您不想要此解决方案,则给定的示例不会声明$mailsIds
。在顶部,它被称为$ids