class SmsLimitService
{
/**
* 全局限制
* @return bool
* @author: mzc
* @date:2017/10/13 9:47
*/
public static function globalLimit($params,$smsType){
$appId = $params['appId']; //应用ID
$tel = $params['tel']; //手机号
//1. ip白名单限制
/*$ip = get_client_ip();
$whiltListIp = M('WhiteList')->field("INET_NTOA(ip) as ip")->select();
$whiltListIp = array_column($whiltListIp,'ip');
$res = self::whiteListLimit($ip,$whiltListIp);
if(!$res){
apiResponse(CodeModel::ERROR, $ip.'不在白名单列表里');
}*/
//2.同一手机号多少秒内不能重复发,默认30s
$limitTime = 30;
$cacheName =$appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
$res = self::secondsLimit($limitTime,$cacheName);
if(!$res){
apiResponse(CodeModel::ERROR, '同一手机号'.$limitTime.'内不能重复发送');
}
//3. 同一手机号1小时内限制多少条短信(语音)发送,
$limitNum = 3;
$hour = 1;
$limitTime = $hour*3600;
$cacheStartTime = $appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
$cacheNameNum = $appId.$tel.$smsType.$limitTime.$limitNum;
$res = self::hourLimit($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
if(!$res){
apiResponse(CodeModel::ERROR,'同一手机号'.$limitTime.'小时内限制'.$limitNum.'条短信(语音)发送');
}
//4. 同一手机号1天内限制多少条短信发送,
$limitNum = 3;
$day = 1;
$limitTime = $day*24*3600;
$cacheStartTime = $appId.$tel.$smsType.$limitTime;//应用.电话号码.短信类型(普通短信,语音通知.时间
$cacheNameNum = $appId.$tel.$smsType.$limitTime.$limitNum;
$res = self::DayLimit($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
if(!$res){
apiResponse(CodeModel::ERROR,'同一手机号'.$limitTime.'天内限制'.$limitNum.'条短信(语音)发送');
}
}
/**
* ip白名单限制
* @return bool
* @author: mzc
* @date:2017/10/13 9:46
*/
private static function whiteListLimit($ip,$whiltListIp){
if(in_array($ip,$whiltListIp)){
return true;
}else{
return false;
}
}
/**
* 多少秒内不能重复发,默认30s
* @return bool
* @author: mzc
* @date:2017/10/13 9:46
*/
private static function secondsLimit($limitTime,$cacheName){
if(empty(S($cacheName))){
S($cacheName,1,$limitTime); //缓存时间
return true;
}else{
return false;
}
/*if(empty(S($cacheName))){
S($cacheName,time()); //第一次发送时,缓存起时间
}
$nextTime = time();//本次发送时间
$preTime = S($cacheName);//获取前一次发送时间
if($nextTime-$preTime<$limitTime){
return false;
}else{
S($cacheName,$nextTime);
return true;
}*/
}
/**
* 1小时内限制多少条短信发送,默认3条
* @return bool
* @author: mzc
* @date:ct
*/
private static function hourLimit($limitNum=3,$limitTime=3600,$cacheStartTime,$cacheNameNum){
return self::limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
}
/**
* 1天内限制多少条短信发送,默认10条
* @return bool
* @author: mzc
* @date:2017/10/13 9:46
*/
private static function dayLimit($limitNum=10,$limitTime,$cacheStartTime,$cacheNameNum){
return self::limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum);
}
public static function clear($redis,$key){
$redis->rm($key);
}
private static function limitSend($limitNum,$limitTime,$cacheStartTime,$cacheNameNum){
$redis = Cache::getInstance('redis');
// $redis->clear();
// exit;
$startTime = $redis->get($cacheStartTime);
$num = $redis->get($cacheNameNum);
if(empty($startTime)&&empty($num)){
$redis->set($cacheStartTime,time(),$limitTime);
$redis->set($cacheNameNum,1,$limitTime);
return true;
}else{
$nextTime = time();
// echo $startTime.':'.$nextTime.':'.$num.':'.$limitNum;
if($nextTime-$startTime<$limitTime&&$num>$limitNum){
return false;
}else{
$prefix = C('DATA_CACHE_PREFIX'); //必须加,因为在set,get的时候会默认加上这个
$redis->incr($prefix.$cacheNameNum);
return true;
}
}
}
}
具体参考