这是一个相当模糊的问题所以请光临我。它更多的是关于方法而不是语法。
我有一个填充'notification'的MySQL表(id,user_id,date等)。我必须发送警报(通过电子邮件,Facebook,推特,不管......不是问题),每个条目都是“真实”。这就是问题,当必须计算确定真/假的条件时,我应该如何以最有效的方式将它们ping为真呢?
发送bday的电子邮件很容易。只需搜索今天日期的日期字段。假设您必须每隔20天从该字段中输入的日期开始发送电子邮件?我必须计算每一行,看看它今天是否真实。
我该怎么做?我考虑过以下几点:1。一个复杂的MySQL查询2.一个PHP页面的cron作业贯穿每一行并将它们标记为每隔x秒/分钟1比1完成3.拉出我的头发并跑出房间尖叫像个小女孩。我现在正倾向于3。
我主要担心的是我在共享服务器上,而且我不想做任何过于密集的事情。感谢您花大脑袋。我很感激。
答案 0 :(得分:2)
您应该查看strtotime()
示例,看看它是否可以容纳您发送的警报类型。这可以让您在表格中表示诸如年度提醒(生日),每20天提醒,每月提醒(每月的第一个星期一/上周五)之类的事情:
| id | user_id | status | send_on | next_occurrence |
|------|---------|---------|---------------------|--------------------|
| 1001 | 123 | pending | 2010-03-04 12:00:00 | Next March 4 noon |
| 1002 | 123 | pending | 2010-02-05 00:00:00 | +20 days midnight |
| 1003 | 123 | pending | 2010-02-01 08:00:00 | First Monday 8am |
然后你用一些相当简单的代码设置一个CRON工作(或者在共享主机上的穷人的CRON)每10分钟左右触发一次:
# get pending alerts
$alerts = $this->Alert->find('all', array(
'conditions' => array(
'send_on <=' => date('Y-m-d H:i:s'),
'status' => 'pending',
),
));
# send alerts
foreach ($alerts as $alert) {
# send alert and update status
$status = $this->Something->send($alert);
$status = ($status) ? 'sent' : 'failed';
$this->Alert->id = $alert['Alert']['id'];
$this->Alert->saveField('status', $status);
# generate and save next pending occurrence
$this->Alert->create();
$this->Alert->save(array('Alert' => array(
'user_id' => $alert['Alert']['user_id'],
'status' => 'pending',
'send_on' => strtotime($alert['Alert']['next_occurrence']),
'next_occurrence' => $alert['Alert']['next_occurrence'],
)));
}
快进到今年3月5日,同样的表现在看起来像这样:
| id | user_id | status | send_on | next_occurrence |
|------|---------|---------|---------------------|--------------------|
| 1001 | 123 | sent | 2010-03-04 12:00:00 | Next March 4 noon |
| 1002 | 123 | sent | 2010-02-05 00:00:00 | +20 days midnight |
| 1003 | 123 | sent | 2010-02-01 08:00:00 | First Monday 8am |
| 1004 | 123 | sent | 2010-03-01 08:00:00 | First Monday 8am |
| 1005 | 123 | sent | 2010-02-25 00:00:00 | +20 days midnight |
| 1006 | 123 | pending | 2010-03-17 00:00:00 | +20 days midnight |
| 1007 | 123 | pending | 2010-04-05 08:00:00 | First Monday 8am |
| 1008 | 123 | pending | 2011-03-04 12:00:00 | Next March 4 noon |
答案 1 :(得分:0)
以下是我如何处理类似情况的简化说明,我需要根据不同的复杂条件定期发送短信和电子邮件:
我创建了2个新表:
使用:
然后我根据这些频率设置一个cron来通过scenario表并采用适当频率的场景并收集相关的过滤器(可以是sql语句或php函数)。如果过滤器返回任何结果,则执行与结果相关的操作。我还扩展了这个系统以执行设置,测试和拆解,因此我可以在激活它们之前安全地测试我的场景。
希望这会有所帮助 - 干杯
答案 2 :(得分:0)
你可能想要查看一个队列服务ala beanstalk等。 我知道其中一些你可以将动作/事件发布到队列中并将它们设置为周期性的,有条件的等等。
队列服务器/服务是一个很大的主题,但也许只是把它扔出去会给你一些选择和一些替代思路。