php优雅的批量操作


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);
        }
    }
  • 结合析构方法去写,让整个逻辑更加清晰,减少无关的中间临时变量穿插
  • 使用时需要注意,最好将这类对象放在方法里执行,避免对象没有及时回收,导致析构方法不执行