Inilah cara saya menyelesaikannya untuk saat ini, menggunakan file.
Prosedur
- Dapatkan IP klien dan hash (untuk mencegah pembacaan file).
- Buka file IP dan pindai setiap baris
- Bandingkan waktu rekaman saat ini dengan waktu saat ini
- Jika selisihnya lebih besar dari batas waktu yang ditetapkan ke 5., jika tidak 7.
- Jika IP cocok dengan klien, buat catatan yang diperbarui, jika tidak
- jatuhkan rekor.
- Jika IP cocok dengan klien, berikan pesan kegagalan, jika tidak salin catatan.
Contoh kode
<?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);
?>
Keterangan
Pengguna baru
Jika hash IP tidak cocok dengan catatan apa pun, catatan baru akan dibuat. Perhatian:Akses mungkin gagal jika Anda tidak memiliki hak untuk melakukannya.
Memori
Jika Anda mengharapkan banyak lalu lintas, beralihlah ke solusi basis data seperti ini semua bersama-sama.
Kode redundan
"Tapi minxomat", Anda mungkin berkata, "sekarang setiap klien mengulang seluruh file!". Ya, memang, dan begitulah yang saya inginkan untuk solusi saya. Dengan cara ini, setiap klien bertanggung jawab atas pembersihan seluruh file. Meski begitu, dampak kinerjanya tetap rendah, karena jika setiap klien melakukan pembersihan, ukuran file akan dijaga seminimal mungkin. Ubah ini, jika cara ini tidak berhasil untuk Anda.