Время отсчёта PHP

248
17 сентября 2017, 01:49

Здравствуйте. И так, назрел вопрос. Как же всё таки нормально оформить таймер обратного отсчёта времени? Суть такова, человек получает что то на час. Это считывается к примеру функцией time();. Добавим туда наш час time() + 60 * 60; Получается что есть две переменные. То что нужно. И то что сейчас.

То число, которое нам нужно прибавить человеку, для его дела, заносим в бд. Всё отлично, успешно заносится в бд. А что же первое? Что же делать с ним? Ну себе я лично представлял что будет некое сравнение происходить, примерно вот таким образом :

if( $currentTime >= $toTime)
  { 
    echo "Время истекло"; 
  }else{
    $leftTime = ($toTime - $currentTime); // получим в секундах число.
  # $leftTime = 60 * ($toTime - $currentTime);// число в минутах.. и т.д.
}

Ну вот и получаем собственно говоря, наш таймер, который что то делает спустя целый час. Так вот, как оформить сие чудо, чтобы он брал время человека и начинал отсчёт от к примеру регистрации : человек зарегистрировался, получил на час получение письма, время истекло, он не подтвердил, и его удалило. Но тут попроще, ничего такого делать не нужно. Просто чтобы обработка как то происходила. Вот пример запроса в бд.

$query  = "SELECT * FROM `Users` WHERE `login` = '{$login}' and `password` = '{$password}' LIMIT 1";

где он возвращает массив данных. Из которого, мы уже берём данные, такие как login , password , ну и date (time) . А дальше делать проверку? Брать значение из бд и сравнивать с текущим временем?

Тогда второй назревает вопрос. Если я даже и получил это значени и осталось минут 5 до окончания, как сделать постоянную проверку такого времени? Чтобы не при обращении была проверка, а всегда. Надеюсь всё расписал подробно и доходчиво.

Answer 1

Для этого вам необходимо воспользоваться средствами cron'а, а именно настроить запуск скрипта раз в минуту\две\три (как настроите), который будет брать из базы все строки, toTime в которых меньше текущего времени и не стоит флаг "уже обработан" (в таблицу добавьте тогда еще один столбец), обрабатывать их и заносить в базу что строка обработана.

А если делать еще лучше - то создайте таблицу actions в которой будет указываться айди пользователя, название действия которое необходимо делать и срок, в который это необходимо делать. А затем уже настраиваете крон на запуск скрипта, который будет брать строки из этой таблицы где время "уже пришло", обрабатывать их (можете в зависимости от значения в столбце action написать что-то типа switch ($resRow['action']) { case 'register': do_smth(); break }) и после этого удалять из базы эту строчку, чтоб не держать в базе кучу лишней информации. Этот способ предпочтительнее.

Answer 2

Можно сделать выполнение и на хитах. Делаем метод, который будет обрабатывать все события для каждого пользователя: checkEvents($userId);

Этот метод получает из таблицы все необработанные действия с их крайними сроками. Если время вышло, а задание не выполнено, то запускает нужный коллбэк для каждого события(удалить, напомнить и продлить на час и т.п.).

Если время ещё есть, можно выводить список текущих задач.

Метод checkEvents($userId) запускать при рендере страницы в начале.

Но как и говорили, лучше перенести все такие задачи на крон, который будет запускать этот же метод, только для всех пользователей.

READ ALSO
Почему функция не работает на живом сайте, хотя работала в локальном сайте?

Почему функция не работает на живом сайте, хотя работала в локальном сайте?

Не могу понять, почему функция вывода различных записей работает на локальном сайте, но не работает на живом сайте? Вот например эта:

165
Как вывести двойные кавычки в twig?

Как вывести двойные кавычки в twig?

Как вывести двойные кавычки в twig

385
Русские символы readline() CLI PHP

Русские символы readline() CLI PHP

Запрашиваю ввод в командной строке, в PHP CLI SAPI, с помощью функции readline(), но в командной строке, при вводе русских символов, каракули, и иэроглифыЗнаю,...

262
Ошибка: The driver must be deployed to the target computer for debugging to work

Ошибка: The driver must be deployed to the target computer for debugging to work

Ситуация такая, я пытаюсь запустить драйвер на target машине по гайдуНо получаю ошибку выше

356