Выполнение функций при выполнение 2 разных условиях
Всем привет, у меня есть проблемма, но скажу сначала суть чтобы было ясно.
У меня есть список в Redis который постопенно пополняеться рандомнными количество записамми, например 1000 записей в сек. или 2 записи в сек.
У меня есть скрипт который достаёт записи из Redis, обрабатывает их и рагистрирует в БД.
Скприпт выполняеться каждую минуту через Crontab, сам скрипт имеет проверку что если он уже выполняеться то второй раз не запуститься.
Так вот, я хочу сделать так чтобы скрипт работал как демон в фоновом режиме с такими условиями:
- Если в списке из Рудиса больше определенного количества записей то вызывалась функция которая обрабатывает данные.
- Если в списке меньше записей то данные не обрабатываеться.
- Но скрипт должен выполняться обязательно раз в секунду.
На данынй момент у меня скрипт данные обрабатываються раз в секунду.
Вот мой код
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 шт):
Если кому-то интерестно вот как я это реализовал :
Буду рад если оставьте тут свой вариант, с радостью его посмотрю и изучью
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) {
// Логика
}
}
}