在 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" }
近期评论