每 5 分钟循环更新数据库 table
Update database table cyclically every 5 minutes
我必须根据从其他 table 的数据中选择的内容,使用复杂且昂贵的查询来填充和更新我的 MySql 数据库之一 table。当我对其进行查询时,table 不需要始终完全更新,但我希望每 5 分钟进行一次循环更新。
这个自动更新应该是无限的,我需要确保它永远不会停止。
经过一些研究,我找到了一些解决方案,但我不知道哪个对安全性和性能更好。
其中之一可能是我的目标:
- 不要每次都创建 table 并从 php 进行复杂查询以获得所需的结果
- 创建一个 php 循环重复并更新 table 数据库的脚本,可能使用 Cron Job。
- 使用 sql 事件更新 table
我认为第一个解决方案可能会很昂贵,因为查询很复杂并且每秒可能有很多请求,但结果总是会更新。我没有关于 Cron Job 的经验,所以我不知道这是否是个好主意。对于第三个解决方案,我仍然没有 运行 事件的数据库权限,但我想知道它是否是一个有效的解决方案。
欢迎所有其他解决方案,谢谢。
我会选择 Cron Job。
- 它不会阻塞任何请求,因为它是从操作系统执行的。
- 您可以定义哪个用户执行脚本(
cron -u apache -e
)。
- 易于定义间隔。 (即每 5 分钟
*/5 * * * * php /path/to/script.php
)。
- It's loggable.
补充说明
我在 root 下有一个 cron 作业 运行ning,它工作得很好。我的问题是该项目有一个私有的 日志记录机制 ,每个日志文件将由 apache 用户创建。通过 运行 从 root 连接它,有时文件会由 root 创建,然后,脚本由 [=] 执行22=]apache 将无法 APPEND 到日志。
我还有一个电子邮件脚本,该脚本每 2 分钟 运行 一次,卡住 1 小时。事实证明,由于应用程序中的一个错误,一个无效的电子邮件地址 (somethingwithoutatsign.com) 被插入到数据库中,这使得 PHPMailer 库抛出错误。之后,我添加了一个 catch 块,它会在抛出异常时向我发送电子邮件。现在,如果脚本由于执行不当而停止 运行ning,我会立即知道。
不要使用 cron。想一想如果一个实例超过 5 分钟而下一个实例又启动了会发生什么。最终你将有数百个副本陷入相互绊倒的困境。
取而代之的是让一个作业循环执行更新。 (好吧,你可以有一个 cron 作业来执行 "keep-alive" 任务,如果它死了就重新启动查询。)
这份工作会
CREATE TABLE new ...
INSERT INTO new SELECT complex-stuff...
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
loop.
我必须根据从其他 table 的数据中选择的内容,使用复杂且昂贵的查询来填充和更新我的 MySql 数据库之一 table。当我对其进行查询时,table 不需要始终完全更新,但我希望每 5 分钟进行一次循环更新。
这个自动更新应该是无限的,我需要确保它永远不会停止。
经过一些研究,我找到了一些解决方案,但我不知道哪个对安全性和性能更好。
其中之一可能是我的目标:
- 不要每次都创建 table 并从 php 进行复杂查询以获得所需的结果
- 创建一个 php 循环重复并更新 table 数据库的脚本,可能使用 Cron Job。
- 使用 sql 事件更新 table
我认为第一个解决方案可能会很昂贵,因为查询很复杂并且每秒可能有很多请求,但结果总是会更新。我没有关于 Cron Job 的经验,所以我不知道这是否是个好主意。对于第三个解决方案,我仍然没有 运行 事件的数据库权限,但我想知道它是否是一个有效的解决方案。
欢迎所有其他解决方案,谢谢。
我会选择 Cron Job。
- 它不会阻塞任何请求,因为它是从操作系统执行的。
- 您可以定义哪个用户执行脚本(
cron -u apache -e
)。 - 易于定义间隔。 (即每 5 分钟
*/5 * * * * php /path/to/script.php
)。 - It's loggable.
补充说明
我在 root 下有一个 cron 作业 运行ning,它工作得很好。我的问题是该项目有一个私有的 日志记录机制 ,每个日志文件将由 apache 用户创建。通过 运行 从 root 连接它,有时文件会由 root 创建,然后,脚本由 [=] 执行22=]apache 将无法 APPEND 到日志。
我还有一个电子邮件脚本,该脚本每 2 分钟 运行 一次,卡住 1 小时。事实证明,由于应用程序中的一个错误,一个无效的电子邮件地址 (somethingwithoutatsign.com) 被插入到数据库中,这使得 PHPMailer 库抛出错误。之后,我添加了一个 catch 块,它会在抛出异常时向我发送电子邮件。现在,如果脚本由于执行不当而停止 运行ning,我会立即知道。
不要使用 cron。想一想如果一个实例超过 5 分钟而下一个实例又启动了会发生什么。最终你将有数百个副本陷入相互绊倒的困境。
取而代之的是让一个作业循环执行更新。 (好吧,你可以有一个 cron 作业来执行 "keep-alive" 任务,如果它死了就重新启动查询。)
这份工作会
CREATE TABLE new ...
INSERT INTO new SELECT complex-stuff...
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
loop.