我正在创建一个批处理程序,可以定期从数据库中删除大量不必要的数据。
出于性能原因,我没有使用任何ORM,我只是:
问题在于有时会删除数百万条记录。所以我想在每个查询(delete from foo where id in(...)
)的1000个密钥的部分中删除它们。
我试过了:
$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);
但我仍然得到同样的错误。
答案 0 :(得分:1)
为什么不使用array_chunk?它完全符合您的要求:
$chunks = array_chunk($ids, 1000);
如果您不想要此解决方案,则您的示例不会声明$mailsIds
。在顶部,它被称为$ids