Задать вопрос
@NikHaker
/

Как реализовать таймер на php?

Приветствую. Есть скрипт-демон, который работает бесконечно. Как можно сделать, чтобы раз в сутки один массив внутри этого скрипта обнулялся? И чтобы это минимально повлияло на остальную работу демона.
  • Вопрос задан
  • 9022 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
riky
@riky
Laravel
$startTime = time();
$arr = [];

// ......

while(1) { // main loop
    //......

    if (time() > $startTime + 24*60*60) {
        $startTime = time();
        $arr = [];
    }
}
Ответ написан
Комментировать
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
ну так на вскидку, решение в лоб:
$nullFlag = true;
if($time > 12:00 && < 13:00 && $nullFlag) {
    //обнуляем массив
    $nullFlag = false;
} elseif ($time > 13:00) {
    $nullFlag = true;
}

но это прям такое, топорное решение (код - условный, иллюстрирует исключительно идею).

Можно ещё создавать файл на диске где-то, по cron'у (раз в сутки) и делать например так:
$file_path = "/home/daemon/clear_array.do";
if(file_exists($file_path)) {
    //Очивщаем массив
    unlink($file_path);
}


Основная проблема в том, что я не могу придумать так вот сходу, как расшарить данные во вне, с работающего нон-стоп скрипта, на PHP. Это всё-таки не С++...

Ещё можно попробовать хранить этот массив в Redis, или memcached, и вычищать его оттуда раз в сутки, и при каждой необходимости - считывать его (массив) оттуда. Или сериализовывать его и сохранять на диск.

Если кто-то подскажет, как кусок памяти на ПХП расшарить, я думаю, будет более оптимальное решение.

Можно ещё попробовать вебсокет на ПХП открыть, и при поступлении соотв. команды - очищать массив. Но я сам веб-сокеты в ПХП-реализации не пробовал и не могу к сожалению, подсказать Вам, как это будет выглядеть.

P.S. Реализацию с файлом, можно заменить на запись в БД или в Redis/Memcached. Т.е. проверять не наличие файла, а наличие записи. Кстати да, Redis имеет такой параметр как "срок хранения кэша", в этом случае, даже CRON будет не нужен. Наверняка, что-то такое и в memcached есть.
Ответ написан
PHP React - решит вашу проблему
$loop = React\EventLoop\Factory::create();
$loop->addPeriodicTimer(5, function () {
    //Код
});

$loop->run();
Ответ написан
Комментировать
@Stopy
Создай таблицу со строкой в которой будешь хранить свой массив в формате json-строки и раз в сутки запускай скрипт который будет делать что тебе нужно с этим json-ом
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы