Đâ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
- Lấy IP của máy khách và băm nó (để ngăn chặn việc đọc tệp).
- Mở tệp IP và quét từng dòng
- So sánh thời gian của bản ghi hiện tại với thời gian hiện tại
- 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.
- 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
- giảm kỷ lục.
- 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.