<?php session_start(); $time = 60;//60秒 $count = 10; //可访问 10次 //第一次初始化 if(!isset($_SESSION[‘count‘])){ $_SESSION[‘count‘] = 1; $_SESSION[‘time‘] = time(); $_SESSION[‘cha‘] = 0; $_SESSION[‘status‘] = ‘success‘; print_r($_SESSION); }else { $now = time(); $cha = $now - $_SESSION[‘time‘]; $avg = intval($time / $count);//平均多少秒可获得一次机会 //如果超过次数 if($_SESSION[‘count‘] > $count){ //如果时差超过平均可获得次数的时长 if($cha > $avg){ $_SESSION[‘count‘] -= intval($cha / $avg); //计算可得多少次机会 $_SESSION[‘count‘] = max($_SESSION[‘count‘], 0);//修正次数不能为负。 $_SESSION[‘count‘]++; $_SESSION[‘time‘] = $now; $_SESSION[‘cha‘] = $cha; $_SESSION[‘status‘] = ‘success‘; print_r($_SESSION); }else{ //如果时差没有超过 $avg ,则还是失败。 $_SESSION[‘cha‘] = $cha; $_SESSION[‘status‘] = ‘fail‘; print_r($_SESSION); } }else{ //如果没超过次数正常访问 if($cha > $avg) { $_SESSION[‘count‘] -= intval($cha / $avg); //计算可得多少次机会 $_SESSION[‘count‘] = max($_SESSION[‘count‘], 0);//修正次数不能为负。 } $_SESSION[‘count‘]++; $_SESSION[‘time‘] = $now; $_SESSION[‘cha‘] = $cha; $_SESSION[‘status‘] = ‘success‘; print_r($_SESSION); } }
如果要精确计算,则要记录每次访问以元素的形式记录时间戳,到数组,每次请求的时候,遍历数组元素中的时间戳,与当前时间比较,清理掉 N分钟之前的元素,然后再计算个数,如果个数没超,则允许,反之不行。
原文:https://www.cnblogs.com/zbseoag/p/14284377.html