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