Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách giảm số lần đăng nhập - PHP &MySQL &CodeIgniter

Tôi đã triển khai cơ chế điều tiết của người nghèo trong phunction chỉ sử dụng APC, đây là cách tôi sử dụng nó:

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

Tôi sử dụng điều này trên Front-Controller của mình và chuyển giá trị cho phương thức định tuyến của mình, nhưng đó là một câu chuyện khác.

Điểm mấu chốt là nếu bạn sử dụng APC, bạn có thể lưu giữ mọi thứ rất nhanh trong bộ nhớ và ít tiêu tốn bộ nhớ vì APC tuân theo phương pháp FILO. Nếu bạn cần thời gian chờ cao hơn, bạn có thể cân nhắc sử dụng thứ gì đó không dựa trên bộ nhớ.

BTW:MySQL hỗ trợ các bảng với công cụ MEMORY.

Sự cố với sleep() :

Một máy chủ web Apache điển hình với PHP được cài đặt dưới dạng mô-đun sẽ ăn khoảng 10 MB RAM cho mỗi phiên bản, để tránh vượt quá bộ nhớ RAM khả dụng của bạn, có một số cài đặt Apache mà bạn có thể định cấu hình để giới hạn số phiên bản tối đa mà Apache có thể khởi động.

Vấn đề là khi bạn sleep() , phiên bản đó vẫn đang hoạt động và với đủ yêu cầu có thể sẽ ăn hết các vị trí có sẵn để khởi động máy chủ mới, do đó khiến trang web của bạn không thể truy cập được cho đến khi hoàn thành một số yêu cầu đang chờ xử lý.

Không có cách nào để khắc phục điều này từ PHP AFAIK, vì vậy cuối cùng thì tùy thuộc vào bạn.

Nguyên tắc tương tự đối với điều chỉnh toàn hệ thống:

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. Ràng buộc duy nhất cho phép các giá trị trống trong MySQL

  2. MySQL lấy (các) chuỗi giữa hai cặp # / nhiều cặp #

  3. Tổng tích lũy MySQL được nhóm theo ngày

  4. MySQL - CHỌN * VÀO VỊ TRÍ OUTFILE?

  5. Chỉ cần chọn dữ liệu có chứa dấu gạch chéo ngược trong MySQL