使用CakePHP发送警报的方法

时间:2010-01-19 06:10:48

标签: php mysql cakephp

这是一个相当模糊的问题所以请光临我。它更多的是关于方法而不是语法。

我有一个填充'notification'的MySQL表(id,user_id,date等)。我必须发送警报(通过电子邮件,Facebook,推特,不管......不是问题),每个条目都是“真实”。这就是问题,当必须计算确定真/假的条件时,我应该如何以最有效的方式将它们ping为真呢?

发送bday的电子邮件很容易。只需搜索今天日期的日期字段。假设您必须每隔20天从该字段中输入的日期开始发送电子邮件?我必须计算每一行,看看它今天是否真实。

我该怎么做?我考虑过以下几点:1。一个复杂的MySQL查询2.一个PHP页面的cron作业贯穿每一行并将它们标记为每隔x秒/分钟1比1完成3.拉出我的头发并跑出房间尖叫像个小女孩。我现在正倾向于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个新表:

  • 场景(id;名称;频率)
  • processes(id; scenario_id; process_type; execution_type; process)

使用:

  • scenario.frequency:每小时,每日,每周或每月
  • processes.process_type:过滤器或操作
  • processes.execution_type:sql或function

然后我根据这些频率设置一个cron来通过scenario表并采用适当频率的场景并收集相关的过滤器(可以是sql语句或php函数)。如果过滤器返回任何结果,则执行与结果相关的操作。我还扩展了这个系统以执行设置,测试和拆解,因此我可以在激活它们之前安全地测试我的场景。

希望这会有所帮助 - 干杯

答案 2 :(得分:0)

你可能想要查看一个队列服务ala beanstalk等。 我知道其中一些你可以将动作/事件发布到队列中并将它们设置为周期性的,有条件的等等。

队列服务器/服务是一个很大的主题,但也许只是把它扔出去会给你一些选择和一些替代思路。