sql >> Base de Datos >  >> RDS >> Mysql

¿Una forma portátil de proporcionar un período de recuperación basado en IP?

Así es como lo resolví por ahora, usando un archivo.

Procedimiento

  1. Obtenga la IP del cliente y haga un hash (para evitar la lectura de archivos).
  2. Abrir archivo IP y escanear cada línea
  3. Compare la hora del registro actual con la hora actual
  4. Si la diferencia es mayor que el tiempo de espera establecido, pase a 5., de lo contrario, 7.
  5. Si la IP coincide con el cliente, cree un registro actualizado, de lo contrario
  6. soltar registro.
  7. Si la IP coincide con el cliente, proporcione un mensaje de error; de lo contrario, copie el registro.

Código de ejemplo

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

Observaciones

Usuarios nuevos

Si el hash de IP no coincide con ningún registro, se crea un nuevo registro. Atención:el acceso puede fallar si no tiene derechos para hacerlo.

Memoria

Si espera mucho tráfico, cambie a una solución de base de datos como esto todos juntos.

Código redundante

"Pero minxomat", podría decir, "¡ahora cada cliente recorre todo el archivo!". Sí, efectivamente, y así lo quiero para mi solución. De esta forma, cada cliente es responsable de la limpieza de todo el archivo. Aun así, el impacto en el rendimiento se mantiene bajo, porque si todos los clientes limpian, el tamaño del archivo se mantendrá en el mínimo absoluto. Cambie esto, si de esta manera no funciona para usted.