Во-первых, важно уточнить, что вы на самом деле после здесь. Из того, что я понимаю, ваше намерение и общая цель состоит в том, чтобы предотвратить злоупотребление системой. Это достижимо, если слишком много запросов не перегружают систему.
Однако для этого вам не нужно откладывать выполнение подпрограммы. Скорее проще и разумнее просто остановить запрос на выполнение подпрограммы, если он превысил критерии максимального использования в течение заданного промежутка времени.
Это также известно как ограничение скорости .
Ограничение скорости может быть легко достигнуто путем сохранения IP-адреса или идентификатора пользователя в memcached или redis (или в любом хранилище ключей / значений или базы данных) вместе с отметкой времени последней успешной попытки. произошло. Таким образом, проверка текущей отметки времени и сохраненной отметки времени приводит к решению разрешить или запретить выполнение подпрограммы.
В качестве примера, скажем, мы хотим, чтобы только каждый IP-адрес мог создавать максимально 1 запрос каждые 15 секунд.
// check if a successful attempt has already occurred in the last 15 seconds
$ts = $memcached->get($ip);
if (time() - $ts <= 15) { // attempt exceeds rate limit
echo "Request denied. You've exceeded your rate limit!";
} else { // attempt does not exceed rate limit
$memcached->set($ip, time()); // store the timestamp of last successful attempt
doRoutine(); // OK to proceed
}