使用cron作业和发送电子邮件时CPU使用率很高

时间:2011-10-11 22:59:15

标签: php mysql email cron cpu-usage

我有一个网站,根据用户的时区和小时设置向用户发送每日写作提醒。例如:纽约(America / New_York)的用户更喜欢在晚上9点收到他的提醒。在我当前的实现中(经过多次更改)后,我将时区和notify_hour存储在设置表中,并查找具有复杂且繁重的MySQL查询的用户。

查询速度太慢,我添加了索引,它使速度更快。找到用户后,我尝试通过外部smtp服务器(sendgrid.com)发送电子邮件。我已经将cron作业设置为每10分钟运行一次并检查200个用户。我有大约2000个活跃用户。它工作得很好。我的大多数用户都位于伊朗(亚洲/德黑兰),他们中的大多数都选择了9PM接收提醒。所以高峰时间是晚上8点到晚上11点之间。

但服务器管理员说我的cron作业使用了太多的CPU。大约25%是高。 我试图调试我的脚本,他们查询本身很快但是当通过smtp服务器发送电子邮件时,它需要更长的时间:

Email Reminder has been sent to 4 People - Query: 0.75444 Seconds
---- System: 11.18443 Seconds. ----

Email Reminder has been sent to 0 People - Query: 0.65488 Seconds
---- System: 0.68821 Seconds. ----

Email Reminder has been sent to 5 People - Query: 0.75551 Seconds
---- System: 3.45176 Seconds. ----

Email Reminder has been sent to 1 People - Query: 2.37117 Seconds
---- System: 9.05586 Seconds. ----

第一个数字是查询花了多长时间,第二个数字是整个系统加载的时间。

这是我用于cron作业的脚本:http://pastebin.com/Eee3Lzys
邮件程序类在构造时连接到smtp服务器,并在脚本的每次迭代时发送一封电子邮件。 (对不起我的英文!)

你能建议一个更好的方法来实现整个事情或最小化cpu使用或其他什么吗? 感谢。

1 个答案:

答案 0 :(得分:0)

请不要插入循环

foreach($users as $k => $v){ 

使用多个原始插入,除了这个sql查询之外会很快,因为它取决于你的实时服务器上的数据。