24小时后如何更改mysql数据库中的值?用户是否需要访问网站才能运行查询?例如,我有一个名为“user-rank”的列,它的值为“10”,我希望它在 24 小时后为“20”......
5 回答
Crontab aka CRON 是最灵活的解决方案,但您需要在 shell 或特定控制面板中拥有使用它的权限,因为出于安全原因,许多托管服务提供商不喜欢与其共享权限。
首先创建带有更新代码的 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
?>
接下来,您需要通过在 shell 中调用“crontab -e”来向 crontab 添加条目,像这样粘贴代码并保存更改:
0 0 * * * /usr/bin/php -f /path/to/my_update_script.php > /dev/null
此条目将定义每天午夜(服务器时间)对脚本的调用,并忽略脚本的任何输出。
注意:您需要为不同的操作系统或用户定义的配置文件指定 php 二进制文件的确切路径。使用“ which php ”shell 命令检查它。
- - - - - - - - 更新 - - - - - - - -
没有 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 系统上执行此操作的一种方法。