侧边栏壁纸
博主昵称
梦之中小俊

以前高中时,羡慕大学考试只要及格就行;现在大学了,怀念高中考试及不及格都行??

PHP

thinkphp6 pthreads 多线程

梦之中小俊
2023-05-13 / 0 评论 / 771 阅读 / 推送成功!

在 PHP 中,多线程不是原生支持的,但我们可以使用扩展来实现多线程,例如 pthreads 扩展。不过,由于 pthreads 扩展存在一些缺陷和稳定性问题,且并不适合运用于所有场景,因此我们不建议您在生产环境中直接使用 pthreads 扩展。

在 ThinkPHP6 中,框架提供了 Process 组件来实现多进程操作,可以用来代替多线程的实现。下面提供一个示例代码,以演示如何使用多进程处理数据,并更新数据库。

setName('update')->setDescription('使用多进程方式更新用户信息');
    }

    protected function execute(Input $input, Output $output)
    {
        $startTime = microtime(true);
        $output->info('开始使用多进程方式更新用户信息...');

        $total = Db::name($this->table)->count();
        $output->info("共有 {$total} 条记录需要更新");

        if ($total <= 0) {
            $output->error('没有需要更新的记录');
            return;
        }

        // 分割数据
        $pageSize = ceil($total / $this->processNum);

        $processArr = [];

        for ($i = 0; $i < $this->processNum; $i++) {
            $start = $pageSize * $i;

            $process = new Process(function () use ($start, $pageSize) {
                $dbConfig = [
                    'type' => 'mysql',
                    'hostname' => '127.0.0.1',
                    'username' => 'root',
                    'password' => 'root',
                    'database' => 'test',
                    'hostport' => '',
                    'params' => [],
                    'charset' => 'utf8mb4',
                    'prefix' => '',
                ];
                Db::setConfig($dbConfig);

                while (true) {
                    $users = Db::name($this->table)
                        ->where('id', '>=', $start)
                        ->limit($this->batchSize)
                        ->select();

                    if (empty($users)) {
                        break;
                    }

                    $ids = [];
                    foreach ($users as $user) {
                        $ids[] = $user['id'];
                        // 更新用户信息
                        Db::name($this->table)->where('id', $user['id'])->update(['is_updated' => 1]);
                    }

                    $msg = '[' . date('Y-m-d H:i:s') . '] ' . implode(',', $ids) . "\n";
                    file_put_contents('update.log', $msg, FILE_APPEND);

                    $start += $this->batchSize;
                }
            });

            $process->start();
            $processArr[$process->getPid()] = $process;
        }

        // 阻塞等待子进程执行完毕
        foreach ($processArr as $pid => $process) {
            $process->wait();
            unset($processArr[$pid]);
        }

        $endTime = microtime(true);
        $output->info('多进程更新用户信息完成,用时 ' . round($endTime - $startTime, 4) . ' 秒。');
    }
}
本文共 个字数,平均阅读时长 ≈ 分钟,您已阅读:0时0分0秒。
3

打赏

评论 (0)

OωO
  • ::(呵呵)
  • ::(哈哈)
  • ::(吐舌)
  • ::(太开心)
  • ::(笑眼)
  • ::(花心)
  • ::(小乖)
  • ::(乖)
  • ::(捂嘴笑)
  • ::(滑稽)
  • ::(你懂的)
  • ::(不高兴)
  • ::(怒)
  • ::(汗)
  • ::(黑线)
  • ::(泪)
  • ::(真棒)
  • ::(喷)
  • ::(惊哭)
  • ::(阴险)
  • ::(鄙视)
  • ::(酷)
  • ::(啊)
  • ::(狂汗)
  • ::(what)
  • ::(疑问)
  • ::(酸爽)
  • ::(呀咩爹)
  • ::(委屈)
  • ::(惊讶)
  • ::(睡觉)
  • ::(笑尿)
  • ::(挖鼻)
  • ::(吐)
  • ::(犀利)
  • ::(小红脸)
  • ::(懒得理)
  • ::(勉强)
  • ::(爱心)
  • ::(心碎)
  • ::(玫瑰)
  • ::(礼物)
  • ::(彩虹)
  • ::(太阳)
  • ::(星星月亮)
  • ::(钱币)
  • ::(茶杯)
  • ::(蛋糕)
  • ::(大拇指)
  • ::(胜利)
  • ::(haha)
  • ::(OK)
  • ::(沙发)
  • ::(手纸)
  • ::(香蕉)
  • ::(便便)
  • ::(药丸)
  • ::(红领巾)
  • ::(蜡烛)
  • ::(音乐)
  • ::(灯泡)
  • ::(开心)
  • ::(钱)
  • ::(咦)
  • ::(呼)
  • ::(冷)
  • ::(生气)
  • ::(弱)
  • ::(狗头)
泡泡
阿鲁
颜文字
取消
  1. 头像
    6767 Lv.1
    iPhone · Safari
    沙发

    画图

    回复
  2. 头像
    6767 Lv.1
    Windows 10 · Google Chrome
    板凳

    表情

    回复
  3. 头像
    透露 Lv.2
    Android · QQ Browser
    第30楼

    649494848

    回复