Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara portabel untuk menyediakan periode cooldown berbasis IP?

Inilah cara saya menyelesaikannya untuk saat ini, menggunakan file.

Prosedur

  1. Dapatkan IP klien dan hash (untuk mencegah pembacaan file).
  2. Buka file IP dan pindai setiap baris
  3. Bandingkan waktu rekaman saat ini dengan waktu saat ini
  4. Jika selisihnya lebih besar dari batas waktu yang ditetapkan ke 5., jika tidak 7.
  5. Jika IP cocok dengan klien, buat catatan yang diperbarui, jika tidak
  6. jatuhkan rekor.
  7. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel memvalidasi unik jika id sama

  2. Cara Menggunakan Kata Sandi Asli Dengan MySQL 5.7

  3. Urutan hasil agar sesuai dengan urutan nilai dalam ekspresi WHERE IN

  4. Tanggal PHP ('W') vs MySQL YEARWEEK (sekarang ())

  5. Tweak kinerja InnoDB