<?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()); } }
php结合swoole多进程导入数据
最新推荐文章于 2023-05-03 16:41:02 发布