在 PHP 7.4 中,带索引检查计算数组的差集,以对比 Body 中的请求参数与缓存中的数组是否相等
1、在 Postman 中 POST:http://api.pcs-api.localhost/v1/mobile/rtcs/invite-accept ,将 Body 中的数据以数组的格式写入 Redis 缓存中,如图1
2、每一次请求时,Body 中的数据会发生变化,其程序中的实现逻辑如下:
RTC 邀请接受通话:/mobile/rtcs/invite-accept ( mobile/rtc/invite-accept ) 1、请求参数列表 ( 1 ) user_name:必填,用户名称 ( 2 ) call_mode:必填,通话方式,voice_call:语音通话;video_call:视频通话 2、输入数据验证规则 ( 1 ) 必填:user_name、call_mode ( 2 ) 字符串:user_name、call_mode ( 3 ) 范围([voice_call, video_call]):call_mode ( 4 ) 判断房间是否存在,是:响应失败 3、操作数据 ( 1 ) 设置RTC 邀请接受通话数据的缓存键 ( 2 ) 从缓存中取回RTC 邀请接受通话数据 A、如果不存在,则序列化,将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留 B、如果存在,则反序列化,带索引检查计算数组的差集,如果差集不为空,将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
3、带索引检查计算数组的差集,以对比数组是否相等。由于 Body 中的数据经过了严格的验证,因此,可以确保 Body 中的数据仅会小于等于缓存中的数据。代码实现如下:
        // 设置RTC 邀请接受通话数据的缓存键
        $redisCache = Yii::$app->redisCache;
        $gisRtcInviteAcceptCacheKey = implode(':', ['gis', 'rtc', 'invite', 'accept', $identity->group_id]);
        // 从缓存中取回RTC 邀请接受通话数据
        $gisRtcInviteAcceptCacheData = $redisCache[$gisRtcInviteAcceptCacheKey];
        $requestGisRtcInviteAccept = [
            'user_name' => $user_name,
            'call_mode' => $call_mode,
        ];
        if ($gisRtcInviteAcceptCacheData === false) {
            // 将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
            $redisCache->set($gisRtcInviteAcceptCacheKey, serialize($requestGisRtcInviteAccept));
        } else {
            $gisRtcInviteAccept = unserialize($gisRtcInviteAcceptCacheData);
            // 带索引检查计算数组的差集
            $result = array_diff_assoc($gisRtcInviteAccept, $requestGisRtcInviteAccept);
            if (!empty($result)) {
                // 将RTC 邀请接受通话数据存放到缓存供下次使用,在缓存中永久保留
                $redisCache->set($gisRtcInviteAcceptCacheKey, serialize($requestGisRtcInviteAccept));
            }
        }
4、array_diff_assoc() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意和 array_diff() 不同的是键名也用于比较。分别打印缓存中的数组、Body 中的请求数据、带索引检查计算数组的差集。符合预期。仅当 带索引检查计算数组的差集 不为空时,才重新设置覆盖缓存中的数据。
$gisRtcInviteAccept
Array
(
    [user_name] => huaqiyun
    [call_mode] => voice_call
)
{
    "user_name": "huaqiyun1",
    "call_mode": "voice_call"
}
array(1) {
  ["user_name"]=>
  string(8) "huaqiyun"
}
$gisRtcInviteAccept
Array
(
    [user_name] => huaqiyun
    [call_mode] => voice_call
)
{
    "user_name": "huaqiyun",
    "call_mode": "video_call"
}
array(1) {
  ["call_mode"]=>
  string(10) "voice_call"
}
$gisRtcInviteAccept
Array
(
    [user_name] => huaqiyun
    [call_mode] => voice_call
)
{
    "user_name": "huaqiyun2",
    "call_mode": "video_call"
}
array(2) {
  ["user_name"]=>
  string(8) "huaqiyun"
  ["call_mode"]=>
  string(10) "voice_call"
}

 
																			 
																			 
																			
近期评论