每5分钟循环更新数据库表。

3
我需要使用一条复杂而昂贵的查询从其他表的数据选择性地填充和更新一个MySQL数据库表。每当我对该表进行查询时,它并不总是需要被完全更新,但我希望每5分钟循环更新一次。
这个自动更新应该是无限的,并且我需要确保它永远不会停止。
经过一些研究,我发现了一些解决方案,但我不知道哪个更安全、更高效。
以下是其中一个可能成为我的目标的解决方案:
  1. 不要每次都从PHP创建表格并进行复杂的查询来获取所需的结果;
  2. 创建一个重复循环的PHP脚本并通过Cron Job更新表db;
  3. 使用SQL事件更新表。
我认为第一个解决方案可能太昂贵了,因为查询很复杂,每秒可能有很多请求,但结果始终得到更新。我没有关于Cron Job的经验,所以我不知道它是否是一个好主意。至于第三个解决方案,我仍然没有数据库权限来运行事件,但我想知道它是否是一个有效的解决方案。
欢迎提出其他解决方案,谢谢。

方案#2可能是最优的,一个由cronjob触发的PHP脚本来处理您表格的更新。您是否在其中缓存查询结果? - GrafiCode
不,我不需要缓存查询结果,因为我不必输出它们。这个表格被用作其他大表的连接过滤器。类似于一个只包含30个项目的表格,从其他表格中取出,在那个时刻是特定属性最好的。我不知道如何使用cron job实现它,但我可以确定循环永远不会停止吗? - lubilis
你可以在MySQL中创建一个“VIEW”。 - cmorrissey
2个回答

0

我会选择使用 Cron Job。

  1. 它不会阻塞任何请求,因为它是从操作系统执行的。
  2. 您可以定义哪个用户执行脚本(cron -u apache -e)。
  3. 很容易定义间隔时间。(例如每5分钟 */5 * * * * php /path/to/script.php)。
  4. 它可以记录日志

附加说明

我有一个在root下运行的cron job,它完全正常。我的问题是该项目有一个私有的日志机制,每个日志文件都是由apache用户创建的。通过从root运行它,有时文件将由root创建,之后由apache执行的脚本将无法追加到日志中。

我曾经有一个每两分钟运行一次的电子邮件脚本,卡了1小时。原来,由于应用程序中的一个错误,一个无效的电子邮件地址(somethingwithoutatsign.com)被插入到数据库中,这使得PHPMailer库抛出错误。之后,我添加了一个catch块,每当抛出异常时就会向我发送电子邮件。现在,如果脚本因执行不良而停止运行,我会立即知道。


0

不要使用cron。想想如果一个实例超过5分钟并且下一个开始,会发生什么。最终,你将有成百上千份副本互相干扰。

相反,使用循环中的单个作业来进行更新。(好吧,你可以有一个cron作业执行“保持活动”任务,重新启动查询如果它死了)。

这项工作将会

CREATE TABLE new ...
INSERT INTO new  SELECT complex-stuff...
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
loop.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接