У меня была похожая задача с запросами к апи, ограниченными по времени: не более 3 в секунду с одним токеном. Думаю, вам подойдёт такой алгоритм:
Хранить в качестве значения массив времён (unix timestamp: time()) последних обращений.
"8.8.8.8" => "1321009871,1421009871,1521009871"
При поступлении очередного смотрим, сколько значений сейчас в массиве.
Меньше 3 – выполняем запрос.
3, но время последнего более, чем достаточно назад – выполняем запрос.
Иначе отклоняем.
При выполнении запроса добавляем в начало массива текущее время, и стираем лишние элементы, если больше 3 получилось.