数据库 - Model 前置说明
官方开源项目 抓取代理IP

关于数据回写

在使用缓存时,我们往往都需要将数据,定时回写到Mysql。

如果你也需要该功能的话,记得在对象模型中,将protected $timer = false;改为true,否则缓存在更新时不会进行记录。

回写示例

继续使用文档中的User模型为例。

下面我们创建一个每10秒,回写一次数据库的定时器,文件存储在:/box/crontab/UserUmlWriteBack.php

写入以下代码:

namespace box\crontab;
use x\Crontab;

class UserUmlWriteBack extends Crontab{

    /**
     * 执行入口
    */
    public function run() {
        $User = new \app\uml\User();
        $list = $User->getWriteBack();

        if (empty($list)) return false;

        // 单个进程负责的回写数量
        $oneMax = 1000;
        $i = 0;
        $num = 0;
        // 把数据分批
        foreach ($list as $info) {
            if ($num == $oneMax) {
                $i++;
                $num = 0;
            }
            
            $all[$i][] = $info;
            $num++;
        }

        // 批量执行 - 此处使用多进程
        $channel = new \Swoole\Coroutine\Channel;
        foreach ($all as $k=>$list) {
            //创建子进程
            go(function () use ($channel, $User, $list){
                $num = 0;
                foreach ($list as $info) {
                    // 此处将info回写到数据库即可
                    // 成功删除记录
                    $res = $User->deleteWriteBack($info['id']);
                    if ($res) $num++;
                }
                $channel->push($num);
            });
        }
        // 获取结果
        $total = 0;
        foreach ($all as $k=>$json) {
            $total += $channel->pop();
        }
        // 关闭管道
        $channel->close();
        
        // 成功回写的数量
        return $total;
    }
}

SW-X

企业级 - 高性能 PHP 框架

最后更新:2年前 . 作者-小黄牛

本篇目录