Выполнение функций при выполнение 2 разных условиях

Всем привет, у меня есть проблемма, но скажу сначала суть чтобы было ясно.

У меня есть список в Redis который постопенно пополняеться рандомнными количество записамми, например 1000 записей в сек. или 2 записи в сек. У меня есть скрипт который достаёт записи из Redis, обрабатывает их и рагистрирует в БД.

Скприпт выполняеться каждую минуту через Crontab, сам скрипт имеет проверку что если он уже выполняеться то второй раз не запуститься.

Так вот, я хочу сделать так чтобы скрипт работал как демон в фоновом режиме с такими условиями:

  1. Если в списке из Рудиса больше определенного количества записей то вызывалась функция которая обрабатывает данные.
  2. Если в списке меньше записей то данные не обрабатываеться.
  3. Но скрипт должен выполняться обязательно раз в секунду.

На данынй момент у меня скрипт данные обрабатываються раз в секунду.

Вот мой код

class ProcessIncomingChargeList
{
    const LIMIT_PACKAGE = 400;
    const LIMIT_INSERTED = 200;
    const USLEEP_TIME = 1 * 1000000; // Время в секундах

    public static function process()
    {
        while (true) {
            $start = microtime(true);
            self::execute();
            $end = microtime(true);

            $executeTime = self::USLEEP_TIME - ($end - $start);
            if ($executeTime > 0) {
                usleep($executeTime );
            }
        }
    }

    public static function execute()
    {
        $data = CacheService::getFromList(Configuration::$incoming_charge_status_list, 0, self::LIMIT_PACKAGE - 1);
        $count = count($data);
        if (!$count) {
            return;
        }

        foreach ($data as $id => $item) {
            // Обработка данных
        }
    }
}

Ответы (1 шт):

Автор решения: Проста Miha

Если кому-то интерестно вот как я это реализовал :

Буду рад если оставьте тут свой вариант, с радостью его посмотрю и изучью

class ProcessIncomingChargeList
{
    const LIMIT_PACKAGE = 400;
    const LIMIT_INSERTED = 200;
    const EXECUTE_AFTER = 30 * 1000000; // Время в секундах

    public static function process()
    {
        $start = microtime(true);
        while (true) {
            $data  = CacheService::getFromList(Configuration::$incoming_charge_status_list, 0, self::LIMIT_PACKAGE - 1);
            $count = count($data);

            if ($count >= self::LIMIT_INSERTED) {
                self::execute($data);
            }

            $end = microtime(true);
            $executeTime = $end - $start;

            if ($executeTime >= self::EXECUTE_AFTER) {
                self::execute();
                $start = microtime(true);
            }
        }
    }

    public static function execute($data = null)
    {
        $sqlValues = null;

        if (empty($data)) {
            $data = CacheService::getFromList(Configuration::$incoming_charge_status_list, 0, self::LIMIT_PACKAGE - 1);
        }
        $count = count($data);

        if(!$count) {
            return;
        }

        foreach ($data as $id => $item) {
            // Логика
        }    
    }
}
→ Ссылка