Здравствуйте. И так, назрел вопрос. Как же всё таки нормально оформить таймер обратного отсчёта времени? Суть такова, человек получает что то на час. Это считывается к примеру функцией 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 до окончания, как сделать постоянную проверку такого времени? Чтобы не при обращении была проверка, а всегда. Надеюсь всё расписал подробно и доходчиво.
Для этого вам необходимо воспользоваться средствами cron'а, а именно настроить запуск скрипта раз в минуту\две\три (как настроите), который будет брать из базы все строки, toTime в которых меньше текущего времени и не стоит флаг "уже обработан" (в таблицу добавьте тогда еще один столбец), обрабатывать их и заносить в базу что строка обработана.
А если делать еще лучше - то создайте таблицу actions в которой будет указываться айди пользователя, название действия которое необходимо делать и срок, в который это необходимо делать. А затем уже настраиваете крон на запуск скрипта, который будет брать строки из этой таблицы где время "уже пришло", обрабатывать их (можете в зависимости от значения в столбце action написать что-то типа switch ($resRow['action']) { case 'register': do_smth(); break }
) и после этого удалять из базы эту строчку, чтоб не держать в базе кучу лишней информации. Этот способ предпочтительнее.
Можно сделать выполнение и на хитах. Делаем метод, который будет обрабатывать все события для каждого пользователя: checkEvents($userId);
Этот метод получает из таблицы все необработанные действия с их крайними сроками. Если время вышло, а задание не выполнено, то запускает нужный коллбэк для каждого события(удалить, напомнить и продлить на час и т.п.).
Если время ещё есть, можно выводить список текущих задач.
Метод checkEvents($userId) запускать при рендере страницы в начале.
Но как и говорили, лучше перенести все такие задачи на крон, который будет запускать этот же метод, только для всех пользователей.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Не могу понять, почему функция вывода различных записей работает на локальном сайте, но не работает на живом сайте? Вот например эта:
Запрашиваю ввод в командной строке, в PHP CLI SAPI, с помощью функции readline(), но в командной строке, при вводе русских символов, каракули, и иэроглифыЗнаю,...
Ситуация такая, я пытаюсь запустить драйвер на target машине по гайдуНо получаю ошибку выше