Если без БД то файловая система остается.
Например, при заходе посетителя создаем файл с именем его IP и записываем туда time():
// Открываем файл, флаг W означает - файл открыт на запись
$f_hdl = fopen($_SERVER['REMOTE_ADDR'].".txt", 'w');
// Записываем в файл $text
fwrite($f_hdl, time());
// Закрывает открытый файл
fclose($f_hdl);
При следующем заходе можно открыть файл если он существует и проверить содержимое, например так:
if($time=file_get_contents($_SERVER['REMOTE_ADDR'].".txt",)) {
// в переменную $time будет записано time() с предыдущего захода.
// проверяем промежуток между заходами
$result = time() - $time;
// в переменную $result записано промежуточное время между заходами в миллисекундах
}
Далее просто остается определить достаточное это время для того чтоб блокировать вход или нет.
Например:
// Переменная $myTime содержит время через которое можно его пускать еще раз
$myTime = 600;
$result = 60;
if($myTime > $result) {
header("HTTP/1.1 503");
exit();
}
Выше условие, если он зашел чаще чем дозволено в миллисекундах то выдается заголовок с кодом 503 и дальше останавливается выполнение скрипта.