Как я могу изменить значение в базе данных mysql через 24 часа? Требуется ли пользователю посетить веб-сайт для запуска запроса? Например, у меня есть столбец с именем «user-rank», и его значение равно «10», я хочу, чтобы это было «20» через 24 часа …
Crontab aka CRON – это наиболее гибкое решение, но вам нужно иметь права использовать его в оболочке или конкретной панели управления, так как многие хостинг-провайдеры не любят делиться привилегиями по причине безопасности.
Сначала создайте код обновления скрипта скрипта PHP, примерно так:
<?php //connect to database //.... //prepare MySQL query $sql = "UPDATE myTable SET `user-rank` = `user-rank` + 10"; //execute query and handle errors //... //optinal reporting on e-mail //... //end ?>
Затем вам нужно добавить запись в crontab, вызвав «crontab -e» в оболочке, вставьте свой код так и сохраните изменения:
0 0 * * * /usr/bin/php -f /path/to/my_update_script.php > /dev/null
Эта запись будет определять вызов скрипта каждый день в полночь (время сервера) и игнорировать любой вывод из сценария.
ПРИМЕЧАНИЕ. Вам нужно указать точный путь для двоичного файла php, который может отличаться для разных ОС или пользовательского профиля. Проверьте его с помощью команды « who php ».
————— ОБНОВИТЬ —————
Решение без crontab.
Создайте новую таблицу базы данных php_cron и вставьте начальную запись (сначала и только одну) со следующим кодом MySQL:
CREATE TABLE `php_cron` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `last_ts` datetime DEFAULT NULL, PRIMARY KEY (`id`) ); INSERT INTO `php_cron` (`id`, `last_ts`) VALUES (1,'2012-08-10 00:00:00');
Затем создайте новый скрипт PHP, который будет содержать всю необходимую логику для такой задачи и включить его в ваш основной файл index.php или в другие места, где он может быть загружен каждый раз, когда пользователь посещает ваш сайт, например, в каком-то конфиге или подобном скрипте. Я полагаю, что у вас будет по крайней мере один посетитель в день.
Этот новый скрипт должен выполнить две задачи: сначала запросить таблицу php_cron и рассчитать разницу во времени, а если разница больше 24 часов (86400 секунд), тогда выполните код для обновления рейтинга пользователя и сохраните новую временную метку в базе данных.
Этот сценарий может выглядеть так:
<?php //connect to database //.... //get time difference in seconds from last execution $sql1 = "SELECT TIME_TO_SEC(TIMEDIFF(NOW(), last_ts)) AS tdif FROM php_cron WHERE id=1"; $res1 = mysql_query($sql1) or die("[1] MySQL ERROR: ".mysql_error()); $dif = mysql_fetch_assoc($res1['tdif']); if ($dif >= 86400) { //24h //following code will run once every 24h //update user's page rank $sql2 = "UPDATE myTable SET `user-rank` = `user-rank` + 10"; mysql_query($sql2) or die("[2] MySQL ERROR: ".mysql_error()); //update last execution time $sql3 = "UPDATE php_cron SET last_ts = NOW() WHERE id=1"; mysql_query($sql3) or die("[3] MySQL ERROR: ".mysql_error()); } ?>
Этот сценарий не является точным временем, как CRON, но, безусловно, будет выполняться один раз в день. Это может быть исправлено с помощью некоторой логики php / mysql, но я уверен, что это сработает.
Общим решением является создание задания cron для периодического запуска скрипта для обновления всех необходимых обновлений.
Вы можете либо настроить что-то, что запускает запрос, проверяя базу данных в течение последнего времени выполнения, а затем вы можете запустить запрос (все это, когда кто-то посещает сайт). Или вы можете настроить работу cron.
В зависимости от вашей версии MySQL вы можете использовать события.
Сначала отредактируйте файл crontab (в терминале)
crontab -e
Добавьте эту строку в файл:
0 0 * * * php /var/www/myquery.php
Первый 0 означает минуту 0, а второй нуль означает 0h. Другие звезды означают, что работа будет выполняться каждый день.
В файле myquery.php вы помещаете некоторый php, который будет подключаться к вашей базе данных и который выполнит требуемый запрос.
Это способ сделать это на Linux-системах.