sql >> Databáze >  >> RDS >> Mysql

Přenosný způsob poskytování období ochlazení založeného na IP?

Takto jsem to prozatím vyřešil pomocí souboru.

Postup

  1. Získejte IP klienta a zahashujte jej (abyste zabránili čtení souboru).
  2. Otevřete soubor IP a prohledejte každý řádek
  3. Porovnejte čas aktuálního záznamu s aktuálním časem
  4. Pokud je rozdíl větší než nastavený časový limit, přejděte na 5., jinak na 7.
  5. Pokud IP odpovídá klientovi, vytvořte aktualizovaný záznam, jinak
  6. zahodit záznam.
  7. Pokud IP odpovídá klientovi, poskytněte zprávu o selhání, jinak zkopírujte záznam.

Příklad kódu

<?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);
?>

Poznámky

Noví uživatelé

Pokud IP hash neodpovídá žádnému záznamu, vytvoří se nový záznam. Upozornění:Přístup může selhat, pokud k tomu nemáte oprávnění.

Paměť

Pokud očekáváte velký provoz, přejděte na databázové řešení, jako je toto všichni dohromady.

Redundantní kód

"Ale minxomat", dalo by se říci, "teď každý klient prochází celým souborem!". Ano, skutečně, a tak to chci pro své řešení. Tímto způsobem je každý klient zodpovědný za vyčištění celého souboru. I tak je dopad na výkon nízký, protože pokud čistí každý klient, velikost souboru bude udržována na absolutním minimu. Změňte to, pokud vám tento způsob nevyhovuje.




  1. Zhroucení MySQL Innodb

  2. NodeJS MySQL:měření doby provádění dotazu

  3. Služba MySQL57 na místním počítači se spustila a poté zastavila

  4. Jak programově generovat DDL z databáze Oracle?