在 PHP 7.4 中,带索引检查计算数组的差集,以对比 Body 中的请求参数与缓存中的数组是否相等

1、在 Postman 中 POST:http://api.pcs-api.localhost/v1/mobile/rtcs/invite-accept ,将 Body 中的数据以数组的格式写入 Redis 缓存中,如图1

图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"
}

 

永夜