一、规则限制
一天内最多发送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());
}