C'est ainsi que je l'ai résolu pour l'instant, en utilisant un fichier.
Procédure
- Obtenez l'adresse IP du client et hachez-la (pour empêcher la lecture du fichier).
- Ouvrir le fichier IP et scanner chaque ligne
- Comparer l'heure de l'enregistrement actuel à l'heure actuelle
- Si la différence est supérieure au délai défini, passez à 5., sinon 7.
- Si l'IP correspond au client, créez un enregistrement mis à jour, sinon
- supprimer l'enregistrement.
- Si l'adresse IP correspond au client, fournissez un message d'échec, sinon copiez l'enregistrement.
Exemple de code
<?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);
?>
Remarques
Nouveaux utilisateurs
Si le hachage IP ne correspond à aucun enregistrement, un nouvel enregistrement est créé. Attention :L'accès peut échouer si vous n'avez pas les droits pour le faire.
Mémoire
Si vous prévoyez beaucoup de trafic, passez à une solution de base de données telle que ceci tous ensemble.
Code redondant
"Mais minxomat", pourrait-on dire, "maintenant chaque client parcourt tout le fichier !". Oui, en effet, et c'est ainsi que je le veux pour ma solution. De cette façon, chaque client est responsable du nettoyage de l'ensemble du fichier. Même ainsi, l'impact sur les performances est maintenu faible, car si chaque client nettoie, la taille du fichier sera maintenue au minimum absolu. Changez ceci, si cette méthode ne fonctionne pas pour vous.