短信通知限制

来源:互联网 发布:cocos2d js 粒子效果 编辑:程序博客网 时间:2024/05/17 03:21

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;            }        }    }}

具体参考



原创粉丝点击