有个新需求要加上去,防止用户频繁刷新页面。具体需求是当用户在一分钟之后内请求指定的页面超过100次,就直接拒绝请求。仔细分析后发现这个功能用memcache来做最方便:
1、以用户IP和被请求的文件名作为KEY值。
2、以memcached的方法increment()来自增记录用户访问次数,increment()是原子性增加,准确。
3、设置set()时指定过期时间为60s,这样就统计一分钟的访问次数。
于是写了个函数放在项目的初始化文件中调用,函数内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
function requestCount(){
$patharr = pathinfo ( $_SERVER [ 'PHP_SELF' ]);
$filename = explode ( '?' , $patharr [ 'basename' ]); //获取当前文件名
if ( in_array( $filename [ '0' ], array ( 'index.php' , 'login.php' , 'password.php' )) ){
global $memcache ;
$clientip = get_client_ip();
//使用长整型IP和文件名生成KEY
$ipkey = 'C' .sprintf( "%u" , ip2long ( $clientip )). $filename [ '0' ] ;
if ( $visitCount = $memcache ->get( $ipkey ) ){
if ( $visitCount == 100){
die ( '<h1>Please don\'t refresh your page!</h1>' );
} else {
$memcache ->increment( $ipkey );
}
} else {
$memcache ->set( $ipkey ,1,0,60);
}
}
}
|