2011-05-05 20 views
1

我試圖做一個簡單的速率限制,基於從here評論:一個簡單的速率限制在php和memcached的

function set_session_rate_limit($memcache, $name, $user_session, $time) 
{ 
    $memcache->add($name . $user_session, 0, $time); 

    return $memcache->increment($name . $user_session); 
} 


set_session_rate_limit($memcache, 'login_fail_', $user_session, 300); 

function get_session_rate_limit($memcache, $name, $user_session) 
{ 
    return $memcache->get($name . $user_session); 
} 


var_dump(get_session_rate_limit($memcache, 'login_fail_', $user_session)); 

爲什麼上面的代碼返回布爾(假)?

+0

因爲'$ memcache-> get'返回false。 – 2011-05-05 18:51:43

回答

1

Readadd()方法的語法:
bool Memcache::add (string $key , mixed $var [, int $flag [, int $expire ]])
你有
$鍵= $名稱。 $ user_session
$ var = 0
$ flag = $ time
所以,在$ time之前寫入null(flag)。
$memcache->add($name . $user_session, 0, null, $time);
而我覺得方法set在這裏會更有用。

+0

這是memcacheD不是memcache – jonnnnnnnnnie 2011-05-11 23:11:10

1

這可能不合適,但我認爲限速應該儘可能裸露。下面我嘗試了一個簡單的基於會話的限制器。

<?php 
    session_start(); 
    const cap = 3;//Max http requests a host can make 
    const period = 5;//the period in which it limits,60 means 1 minuts 
    $stamp_init = date("Y-m-d H:i:s"); 
    if(!isset($_SESSION['FIRST_REQUEST_TIME'])){ 
      $_SESSION['FIRST_REQUEST_TIME'] = $stamp_init; 
    } 
    $first_request_time = $_SESSION['FIRST_REQUEST_TIME']; 
    $stamp_expire = date("Y-m-d H:i:s", strtotime($first_request_time)+(period)); 
    if(!isset($_SESSION['REQ_COUNT'])){ 
      $_SESSION['REQ_COUNT'] = 0; 
    } 
    $req_count = $_SESSION['REQ_COUNT']; 
    $req_count++; 
    if($stamp_init > $stamp_expire){//Expired 
      $req_count = 1; 
      $first_request_time = $stamp_init; 
    } 
    $_SESSION['REQ_COUNT'] = $req_count; 
    $_SESSION['FIRST_REQUEST_TIME'] = $first_request_time; 
    header('X-RateLimit-Limit: '.cap); 
    header('X-RateLimit-Remaining: ' . (cap-$req_count)); 
    if($req_count > cap){//Too many requests 
      http_response_code(429); 
      exit(); 
    }