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

Một cách di động để cung cấp thời gian hồi chiêu dựa trên IP?

Đây là cách tôi đã giải quyết nó ngay bây giờ, bằng cách sử dụng một tệp.

Quy trình

  1. Lấy IP của máy khách và băm nó (để ngăn chặn việc đọc tệp).
  2. Mở tệp IP và quét từng dòng
  3. So sánh thời gian của bản ghi hiện tại với thời gian hiện tại
  4. Nếu sự khác biệt lớn hơn mức đặt thời gian chờ tối đa 5., ngược lại 7.
  5. Nếu IP khớp với ứng dụng khách, hãy tạo bản ghi cập nhật, nếu không
  6. giảm kỷ lục.
  7. Nếu IP khớp với ứng dụng khách, hãy cung cấp thông báo lỗi, nếu không, hãy sao chép bản ghi.

Mã mẫu

<?php

$sIPHash    = md5($_SERVER[REMOTE_ADDR]);
$iSecDelay  = 10;
$sPath      = "bucket.cache";
$bReqAllow  = false;
$iWait      = -1;
$sContent   = "";

if ($nFileHandle = fopen($sPath, "c+")) {
    flock($nFileHandle, LOCK_EX);
    $iCurLine = 0;
    while (($sCurLine = fgets($nFileHandle, 4096)) !== FALSE) {
        $iCurLine++;
        $bIsIPRec = strpos($sCurLine, $sIPHash);
        $iLastReq = strtok($sCurLine, '|');
        // this record expired anyway:
        if ( (time() - $iLastReq) > $iSecDelay ) {
            // is it also our IP?
            if ($bIsIPRec !== FALSE) {
                $sContent .= time()."|".$sIPHash.PHP_EOL;
                $bReqAllow = true;
            }
        } else {
            if ($bIsIPRec !== FALSE) $iWait = ($iSecDelay-(time()-$iLastReq));
            $sContent .= $sCurLine.PHP_EOL;
        }
    }
}

if ($iWait == -1 && $bReqAllow == false) {
    // no record yet, create one
    $sContent .= time()."|".$sIPHash.PHP_EOL;
    echo "Request from new user successful!";
} elseif ($bReqAllow == true) {
    echo "Request from old user successful!";
} else {
    echo "Request failed! Wait " . $iWait . " seconds!";
}

ftruncate($nFileHandle, 0);
rewind($nFileHandle);
fwrite($nFileHandle, $sContent);
flock($nFileHandle, LOCK_UN);
fclose($nFileHandle);
?>

Nhận xét

Người dùng mới

Nếu băm IP không khớp với bất kỳ bản ghi nào, một bản ghi mới sẽ được tạo. Lưu ý:Có thể không truy cập được nếu bạn không có quyền làm điều đó.

Bộ nhớ

Nếu bạn mong đợi nhiều lưu lượng truy cập, hãy chuyển sang giải pháp cơ sở dữ liệu như cái này tất cả cùng nhau.

Mã dự phòng

"Nhưng minxomat", bạn có thể nói, "bây giờ mỗi khách hàng lặp lại toàn bộ tệp!". Vâng, thực sự, và đó là cách tôi muốn nó cho giải pháp của mình. Bằng cách này, mọi máy khách chịu trách nhiệm dọn dẹp toàn bộ tệp. Mặc dù vậy, tác động đến hiệu suất được giữ ở mức thấp, bởi vì nếu mọi khách hàng đang dọn dẹp, kích thước tệp sẽ được giữ ở mức tối thiểu tuyệt đối. Thay đổi điều này, nếu cách này không hiệu quả với bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL + Truy vấn để trả về tất cả các hàng có cols đang 'hoạt động' trong bảng khác

  2. Cách ghi các bộ sưu tập bản ghi tuần tự trong MySQL

  3. Làm cách nào để sửa đổi mã nguồn của Trình kết nối MySQL và cài đặt nó trên PC của tôi?

  4. sự cố định dạng mysql sang excel

  5. Nhiều cơ sở dữ liệu sử dụng PDO