2010-01-19 2 views
0

Это довольно неясный вопрос, поэтому, пожалуйста, со мной. Это скорее подход, чем синтаксис.Подход к отправке уведомлений с помощью CakePHP

У меня есть таблица MySQL, заполненная «уведомлениями» (id, user_id, date и т. Д.). Я должен отправить предупреждение (по электронной почте, facebook, twitter, независимо от того ... не проблема), когда каждый из этих записей пингует как «true». Вот что я могу сказать, как я могу рассказать им об истинности наиболее эффективным способом, когда должны быть рассчитаны условия, которые определяют истину/ложь?

Отправка сообщения электронной почты bday осуществляется легко. Просто найдите поле даты для сегодняшней даты. Предположим, вы должны отправлять электронную почту каждые 20 дней, начиная с даты, введенной в поле? Я должен рассчитать каждую строку, чтобы узнать, правда ли это сегодня.

Как мне это сделать? Я рассмотрел следующее: 1. сложный запрос MySQL 2. задание на страницу PHP cron запускается через каждую строку и отмечают их как сделанные 1 на 1 каждые x секунд/мин. 3. вытаскивание моих волос и выход из комнаты, кричащей как маленькая девочка. Сейчас я склоняюсь к 3.

Моя главная проблема заключается в том, что я на общем сервере, и я не хочу делать что-либо слишком интенсивное. Спасибо, что потратили свой мозг на это. Я ценю это.

ответ

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 бедняка на общий хозяине), который срабатывает через каждые десять минут или около того с каким-то довольно простым кодом:

# 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'], 
    ))); 
} 

Перенесемся 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 | 
+0

m руда Я посмотрел на вашу иллюстрацию, тем больше я понял, что моя передача в значительной степени сводится к тому, что вы написали. Благодарю. – Selino

0

Ниже несколько упрощается объяснение того, как я подошел к подобной ситуации, когда мне нужно периодически отправлять смс и электронные письма на основе различных сложных условиях:

Я создал 2 новых таблиц:

  • сценариев (идентификатор ; имя; частота)
  • процессы (идентификатор; scenario_id; process_type; execution_type; процесс)

с:

  • scenario.frequency: ежечасно, ежедневно, еженедельно или ежемесячно
  • processes.process_type: фильтр или действие
  • processes.execution_type: SQL или функции

Затем я создал хроны по на эти частоты, чтобы пройти через таблицу сценариев и взять сценарии соответствующей частоты и собрать соответствующий фильтр (который может быть оператором sql или функцией php). Если фильтр возвращает какие-либо результаты, выполните соответствующие действия с результатами. Я также расширил эту систему, чтобы выполнить настройку, тестирование и отключение, чтобы я мог безопасно протестировать мои сценарии, прежде чем активировать их.

Надеется, что это помогает - Приветствия

0

Вы можете посмотреть в службу очереди ала Beanstalk и т.д. я знаю, с некоторыми из них вы можете добавлять действия/событие в очередь и установить их периодические, условно и т. д.

Очередные серверы/службы - это большая тема, но, возможно, просто выбросив ее, вы получите еще несколько вариантов и несколько альтернативных путей мысли.