Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да ограничим опитите за влизане - PHP &MySQL &CodeIgniter

Внедрих механизъм на бедняка в phunction използвайки само APC, аз го използвам ето как го използвам:

// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)

$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);

if ($throttle === true)
{
    // IP exceded 30 requests in the last 60 seconds, die() here
}

else
{
    // $throttle is a float
    // number of requests in the last 30 seconds / 30 seconds

    /*
     1 req / 30 = 0,033 sec
     5 req / 30 = 0,166 sec
    10 req / 30 = 0,333 sec
    15 req / 30 = 0,5   sec
    20 req / 30 = 0,666 sec
    25 req / 30 = 0,833 sec
    30 req / 30 = 1     sec
    */

    usleep(intval(floatval($throttle) * 1000000));
}

Използвам това на моя Front-Controller и предавам стойността на моя метод за маршрутизиране, но това е друга история.

Изводът е, че ако използвате APC, вие можете да съхранявате нещата много бързо в паметта и с малко потребление на памет, тъй като APC следва методологията на FILO. Ако имате нужда от много по-голямо изчакване, може да помислите да използвате нещо, което не е базирано на паметта.

BTW:MySQL поддържа таблици с механизма MEMORY.

Проблемът с sleep() :

Типичен уеб сървър на Apache с инсталиран PHP като модул ще изяде около 10 MB RAM на екземпляр, за да избегнете превишаване на наличната ви памет, има някои настройки на Apache, които можете да конфигурирате, за да ограничите максималния брой екземпляри, които Apache може да стартира.

Проблемът е, когато sleep() , този екземпляр все още е активен и с достатъчно заявки може да изяде всички налични слотове за стартиране на нови сървъри, като по този начин направи вашия уеб сайт недостъпен, докато не бъдат завършени някои чакащи заявки.

Няма начин да се преодолее това от PHP AFAIK, така че в крайна сметка зависи от вас.

Принципът е същият за регулирането в цялата система:

function systemWide($ttl = 86400, $exit = 360)
{
    if (extension_loaded('apc') === true)
    {
        $key = array(__FUNCTION__);

        if (apc_exists(__FUNCTION__) !== true)
        {
            apc_store(__FUNCTION__, 0, $ttl);
        }

        $result = apc_inc(__FUNCTION__, 1);

        if ($result < $exit)
        {
            return ($result / $ttl);
        }

        return true;
    }

    return false;
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Максимален брой SQL заявки на страница

  2. Как да изтриете рекурсивно елементи от таблицата?

  3. Разлика в MySQL между два реда от оператор SELECT

  4. MySQL - защо не индексира всяко поле?

  5. Множество mysql INSERT изрази в една заявка php