php优雅的批量操作
有这一个场景,有些时候需要分批量插入数据,或者分批量将数据合成一个请求,如何封装比较优雅呢?
场景
- 需要根据一定尺寸分批量将数据插入到数据库
一般处理
- 在一个方法中集中处理,比如现在有23个数据,每批5个,最后再将剩余3个写入。
- 这种做法代码可读性不高,毕竟中间会产生很多中间变量
面向对象并且结合析构方法实现
class BatchInsert
{
const SPLIT_NUM = 100;
/**
* @var array
*/
private $data;
public function __construct()
{
$this->data = [];
}
public function add($row)
{
$this->data[] = $row;
if (count($this->data) >= self::SPLIT_NUM) {
$this->batchSave();
}
}
/**
* 批量保存
*/
private function batchSave()
{
$data = $this->data;
$this->data = [];
if (empty($data)) {
return;
}
# batch save
}
public function __destruct()
{
$this->batchSave();
}
}
function run() {
$rows = range(0, 1000);
$batch = new BatchInsert();
foreach($rows as $row) {
$batch->add($row);
}
}
- 结合析构方法去写,让整个逻辑更加清晰,减少无关的中间临时变量穿插
- 使用时需要注意,最好将这类对象放在方法里执行,避免对象没有及时回收,导致析构方法不执行