在网页上有一个谷歌地图,用户可以将位置更改为他感兴趣的位置,并通过按下按钮注册新作业的提醒。保存的兴趣位置将由谷歌地图的边界定义。每当新作业出现在该界限内时,将根据他选择的频率(每小时或每天)向该用户发送电子邮件警报。
问题:我对如何处理所有用户的所有提醒感到困惑。
目前我正在考虑将一个cron作业用于每小时运行一次的每小时警报的所有lat1, lng1, lat2, lng2, user_id
,另一个表的另一个cron作业,每天运行一次,比如说晚上9点。 cron作业将遍历定义谷歌地图边界的所有单个用户的lat,lng对,并在主要jobs
数据库中查询发布时间戳在1小时(或1天)内的任何作业。如果有,将发送电子邮件警报。
这对服务器来说似乎很多工作,特别是当数据库中有5000个用户的位置首选项和1,000,000个作业时。 (30分钟完成cronjob?)我被困在这里,希望你的意见。
答案 0 :(得分:0)
不是每次cron运行时都搜索所有内容(假设我正确地读到了你正在做的事情),我会考虑在添加警报时执行检查:
警报已添加到系统中。系统检查是否存在任何匹配的边界(如果有),然后为每个匹配存储找到该信息到单独的表中。在这个新表中添加两个额外的列,一个用于每小时发送,一个用于每日。
在每小时检查中,只发送尚未应用每小时标志的那些,并且每天发送那些尚未设置每日标志的那些。
然后删除之后设置的任何地方。
这样做,你将完成从每个cron作业(所有警报,所有边界)的大量检查到每个警报的一个较小检查(一个警报,所有边界)的工作。
答案 1 :(得分:0)
我认为你可以用这个频率创建两个cron
(或您喜欢的任何频率)
为什么不在用户订阅某个位置时,在php codeigniter中创建一个包含此作业详细信息的任务文件,而不是为所有用户处理所有警报。例如,user_id,位置(坐标),频率。此任务文件的确切详细信息取决于 在您的情况下,您将需要分析到您的系统。然后将此任务文件放在目录中。
然后根据您在上面指定的频率,创建一个在频率中调用的通用php脚本。此脚本将循环遍历目录,处理任务文件并发送电子邮件。这样,您不必担心扫描整个数据库。还有一些小细节,如删除,更新,删除任务文件,但这完全与实现相关。
旁注,可能这是不可避免的,因为你用php标记了这个问题但是如果你想知道, quartz 正是你想做的,但它在Java中。如果需要,您可以找到here。