在使用缓存时,我们往往都需要将数据,定时回写到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;
}
}