Подход к отправке оповещений с CakePHP - PullRequest
0 голосов
/ 19 января 2010

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 20 января 2010

Вам следует взглянуть на 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 голосов
/ 20 января 2010

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

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

0 голосов
/ 19 января 2010

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

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

  • сценарии (идентификатор; имя; частота)
  • процессов (идентификатор; сценарий_процесса; тип_процесса; тип_процесса; процесс)

с:

  • script.frequency: ежечасно, ежедневно, еженедельно или ежемесячно
  • projects.process_type: фильтр или действие
  • process.execution_type: sql или function

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

Надеюсь, это поможет - ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...