只需要监测a,b,c修改了数据,不需要具体识别什么数据。同步的粒度你也不需要关心。需要跨进程。直接用Yii::$app->cache缓存即可。并发没关系,各自获取同样数据同步各自的即可。会在同步后手动清除。
答:
方案设计
根据你的需求,我们可以使用 Yii::$app->cache
进行缓存,存储每台机器(a, b, c)的修改状态。每次请求时,检查其他机器是否已修改数据,以决定是否提示同步到底稿。
1. 数据存储格式
使用 Yii::$app->cache
以键值对的方式存储修改状态:
[ 'machine_changes' => [ 'a' => true, // a 机器修改了数据 'b' => true, // b 机器修改了数据 'c' => false, // c 机器未修改 ]]
2. 代码实现
(1) 记录某台机器的修改状态
当 a, b, c 任何一台机器修改数据时,调用以下代码:
function markMachineChanged($machine){ $cacheKey = 'machine_changes'; $changes = Yii::$app->cache->get($cacheKey) ?? []; // 标记当前机器已修改 $changes[$machine] = true; // 存入缓存,设置一个适当的过期时间(可根据需求调整) Yii::$app->cache->set($cacheKey, $changes, 3600);}
调用示例:
markMachineChanged('a'); // 记录 a 机器修改了数据markMachineChanged('b'); // 记录 b 机器修改了数据
(2) 检查其他机器是否已修改
当某台机器请求时,它需要检查其他机器是否有更改,并决定是否提示同步:
function checkForSync($machine){ $cacheKey = 'machine_changes'; $changes = Yii::$app->cache->get($cacheKey) ?? []; // 其他机器是否有修改 $otherMachinesChanged = array_filter($changes, function ($key) use ($machine) { return $key !== $machine && $key; // 过滤掉当前机器自身 }, ARRAY_FILTER_USE_KEY); return !empty($otherMachinesChanged);}
调用示例:
if (checkForSync('a')) { echo "其他机器修改了数据,需要同步到底稿!";}
(3) 标记某台机器已同步
当某台机器(如 a
)同步完成后,它应该标记自己已经同步:
function markMachineSynced($machine){ $cacheKey = 'machine_changes'; $changes = Yii::$app->cache->get($cacheKey) ?? []; if (isset($changes[$machine])) { // 标记当前机器已同步(即删除其修改记录) unset($changes[$machine]); Yii::$app->cache->set($cacheKey, $changes, 3600); }}
调用示例:
mark
MachineSynced('a'); // a 机器同步完成后标记
流程总结
修改数据时:调用 markMachineChanged($machine)
记录当前机器已修改数据。
请求检查时:调用 checkForSync($machine)
检查其他机器是否已修改数据,并决定是否提示同步到底稿。
同步完成时:调用 markMachineSynced($machine)
清除当前机器的修改标记。
方案优点
低成本:使用 Yii::$app->cache
,避免数据库额外查询,性能高效。
易扩展:支持任意数量的机器(a, b, c, d…)。
简单可靠:无并发问题,每个机器只关心自己的同步状态。
这个方案完全符合你的要求,符合 Yii 框架的缓存机制,可以直接使用。你可以试试看,看看是否符合你的预期?
发表评论: