3

我必须根据从其他表数据中的选择,使用复杂且昂贵的查询来填充和更新我的 MySql 数据库表之一。当我对其进行查询时,该表不需要始终完全更新,但我希望每 5 分钟进行一次循环更新。

这个自动更新应该是无限的,我需要确保它永远不会停止。

经过一番研究,我找到了一些解决方案,但我不知道哪个对安全性和性能更好。

其中之一可能是我的目标:

  1. 不要每次都从php创建表并进行复杂查询以获得所需的结果
  2. 创建一个循环重复并更新表 db 的 php 脚本,可能使用 Cron Job。
  3. 使用 sql 事件更新表

我认为第一个解决方案可能很昂贵,因为查询很复杂并且每秒可能有很多请求,但结果总是会更新。我没有关于 Cron Job 的经验,所以我不知道这是否是一个好主意。对于第三种解决方案,我仍然没有运行事件的数据库权限,但我想知道它是否是一个有效的解决方案。

欢迎所有其他解决方案,谢谢。

4

2 回答 2

0

我会选择 Cron Job。

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

补充说明

我有一个在root下运行的 cron 作业,它工作得很好。我的问题是该项目有一个私有日志记录机制,每个日志文件都将由apache用户创建。通过从root运行它,有时该文件将由root创建,之后,由apache执行的脚本将无法附加到日志中。

我还有一个电子邮件脚本,它每 2 分钟运行一次,但会卡住 1 小时。事实证明,由于应用程序中的一个错误,一个无效的电子邮件地址 (somethingwithoutatsign.com) 被插入到数据库中,这使得 PHPMailer 库抛出错误。之后,我添加了一个catch块,只要抛出异常,它就会向我发送一封电子邮件。现在,如果脚本因为执行不当而停止运行,我马上就会知道。

于 2015-10-13T19:45:32.970 回答
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.
于 2015-11-01T03:44:02.267 回答