Простой ограничитель скорости в php и memcached - PullRequest
1 голос
/ 05 мая 2011

Я пытаюсь сделать простой ограничитель скорости, основываясь на комментариях от здесь :

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

Почему приведенный выше код возвращает bool (false)?

Ответы [ 2 ]

1 голос
/ 06 декабря 2017

это может быть неуместно, но я считаю, что ограничитель скорости должен быть максимально открытым.Ниже я попробовал простой сессионный ограничитель.

<?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();
    }
1 голос
/ 05 мая 2011

Чтение add() Синтаксис метода:
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
у вас есть
$ key = $ name. $ User_session
$ var = 0
$ flag = $ time
поэтому перед $ time пишите ноль (флаг).
$memcache->add($name . $user_session, 0, null, $time);
И я думаю, что метод set будет более полезным здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...