Lumen数据查询中使用chunk

2021-09-18  本文已影响0人  腿长袖子短

在数据查询中,当一次查询的结果返回的查询结果数据量很大时,一次读取到内存中会造成程序挂掉,但是需求又不能进行数据分页,比如在定时任务中,此时chunk闪亮登场

这是一个定时任务中的使用示例

/**
     * 命令描述
     *
     * @var string
     */
    protected $description = '为已核销未结算未退款的订单券码生成唯一标识key';
    
    /**
     * @var BatchUpdateData
     */
    protected $batch;
    
    /**
     * @var string
     *
     * 加密类型
     */
    const ALGO = 'MD5';
    
    /**
     * @var integer
     *
     * 执行chunk时,数据块的数据容量
     */
    const CHUNK_NUMBER = 2000;
    
    public function __construct(BatchUpdateData $batch)
    {
        parent::__construct();
        $this->batch = $batch;
    }
    
    public function handle()
    {
        set_time_limit(0);
        $updateTableName = 'yz_virtual_log';
        
        VirtualCodeLog::query()
            ->select(['id', 'order_id', 'virtual_code'])
            ->where([
                ['error_status', '=', 1],//已核销
                ['balance_status', '=', 0],//未结算
                ['refund_status', '=', null]//无退款
            ])
            ->chunk(self::CHUNK_NUMBER, function ($ret) use ($updateTableName) {
                $dataArr = [];
                foreach ($ret as $v) {
                    $only_key  = hash_hmac(self::ALGO, $v->order_id . $v->virtual_code, bin2hex(random_bytes(8)));
                    $dataArr[] = [
                        'id' => $v['id'],
                        'only_key' => $only_key
                    ];
                }
                $this->batch::batchUpdate($dataArr, $updateTableName);
            });
    
        $dingDD = new DingMsgController();
        $dingDD->sendMsg('可兰素数据批量生成唯一key','执行成功');
    }
上一篇下一篇

猜你喜欢

热点阅读