Ето как го реших засега с помощта на файл.
Процедура
- Вземете клиентски IP адрес и го хеширайте (за да предотвратите четене на файл).
- Отворете IP файл и сканирайте всеки ред
- Сравнете времето на текущия запис с текущото време
- Ако разликата е по-голяма от зададеното време за изчакване отидете на 5., иначе 7.
- Ако IP съответства на клиент, създайте актуализиран запис, иначе
- изтриване на записа.
- Ако IP съответства на клиента, предоставете съобщение за грешка, в противен случай копирайте записа.
Примерен код
<?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);
?>
Забележки
Нови потребители
Ако IP хешът не съвпада с нито един запис, се създава нов запис. Внимание:Достъпът може да не успее, ако нямате права за това.
Памет
Ако очаквате много трафик, преминете към решение за база данни като това всички заедно.
Излишен код
"Но minxomat", бихте могли да кажете, "сега всеки клиент преглежда целия файл!". Да, наистина, и така го искам за моето решение. По този начин всеки клиент е отговорен за почистването на целия файл. Въпреки това въздействието върху производителността се поддържа ниско, защото ако всеки клиент почиства, размерът на файла ще се поддържа на абсолютния минимум. Променете това, ако този начин не работи за вас.