php+redis限制短信频繁发送

一、规则限制

一天内最多发送25条,1小时内最多发送5条

二、实现思路

1、将手机号作为键
2、将每一次发送短信的时间戳依次存进该键的值中
3、取出键中的值并遍历,查询每个值是否在一天内和一小时内的区间里

三、代码实现

		//获取当前小时内开始的时间戳
		$start_hour = strtotime(date("Y-m-d H:00:00"));
		//获取当前小时内结束的时间戳
		$end_hour = date(("Y-m-d H:59:59"));
		//获取今天开始的时间戳
		$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
		//获取今天结束的时间戳
		$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
		
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        //判断该键是否存在
		if($redis->exists($mobile)){
			//获取该键的数组值
			$arr = $redis->lrange($mobile, 0, -1);
			if($arr){
				$i=0;
				$j=0;
				foreach ($arr as $k => $v) {
					//查询一小时内发送短信的次数
					if ($v>=$start_hour&&$v<=$end_hour) {
						$i++;
					}
					//查询一天内发送短信的次数
					if($v>=$beginToday&&$v<=$endToday){
						$j++;
					}
				}
				//判断一小时内的发送短信次数是否超过5次
				if($i>5){
					$json=array('status'=>1000,'msg'=>'发送短信频繁,请稍后重试');
            		exit(json_encode($json));
				}
				//判断一天内的短信发送次数是否超过25次
				if($j>25){
					$json=array('status'=>1000,'msg'=>'发送短信频繁,请稍后重试');
            		exit(json_encode($json));
				}
				//将本次发送时间存入
				$redis->rpush($mobile,time());
			}
		}else{
			//如果不存在  则把当前时间内存入时间戳,并继续向下执行,发送短信
			$redis->rpush($mobile, time());
		}
发布了328 篇原创文章 · 获赞 110 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/qq_42249896/article/details/104001288