php结合swoole多进程导入数据

<?php

namespace app\commands;

use yii\console\Controller;
use Yii;

class ImportController extends Controller
{
    private function _batchUpdate($updateRows)
    {
        $connection = Yii::$app->db;
        $sql = "UPDATE `xcxmall_inventory` SET `stock` = CASE id ";
        foreach ($updateRows as $k => $v) {
            $id = $v[0];
            $ids[] = $id;
            $stock = $v[1];
            $sql .= ' WHEN ' . $id . ' THEN ' . $stock . '';
        }
        $sql .= ' END, ' . ' `status` = CASE id';
        foreach ($updateRows as $k => $v) {
            $id = $v[0];
            $ids[] = $id;
            $status = $v[2];
            $sql .= ' WHEN ' . $id . ' THEN ' . $status . '';
        }
        $sql .= ' END ';
        $sql .= ' WHERE `id` IN (' . join(',', $ids) . ')';

        $command = $connection->createCommand($sql);
        return $command->execute();
    }

    //多进程导入数据
    public function actionInventory($store_id)
    {
        date_default_timezone_set("PRC");
        if ((int)$store_id < 0) return false;
        $import_data = json_decode(Yii::$app->cache->get("inventory_".date('Y-m-d') . $store_id));
        if (empty($import_data)) {
            echo '导入数据缓存为空';
            return false;
        }

        $import_data_chunk = array_chunk($import_data, 20000);
        $work_number = count($import_data_chunk);
        $worker = [];

        echo '开始时间:' . date('h:i:s', time()) . PHP_EOL;
        for ($i = 0; $i < $work_number; $i++) {
            //创建多线程
            $pro = new \swoole_process(function (\swoole_process $work) use ($i, $import_data_chunk) {
                $updateRows = $import_data_chunk[$i];
                $successCount = $this->_batchUpdate($updateRows);
                //写入管道
                $work->write($successCount . PHP_EOL);
            }, true);
            $pro_id = $pro->start();
            $worker[$pro_id] = $pro;
        }
        //读取管道内容
        foreach ($worker as $v) {
            echo $v->read() . PHP_EOL;
        }
        \swoole_process::wait();
        Yii::$app->cache->delete("inventory_".date('Y-m-d') . $store_id);
        echo '结束时间:' . date('h:i:s', time());
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值