Лучший способ управлять работой Cron для сайта регистрации - PullRequest
1 голос
/ 19 октября 2010

Я управляю сайтом регистрации, которому нужны некоторые новые функции для наших агентов.Мы пытаемся выполнить следующие действия:

  • За каждые 3 участника и агента он получает подарочную карту (электронное письмо, отправленное администратору для рассылки)
  • Для 10 заявокв месяц агент получает свои маркетинговые материалы бесплатно в течение года (помечается в наших изменениях в БД)
  • При 25 общих зачислениях в любое время агент получает свои маркетинговые материалы бесплатнов течение года

У меня нет проблем с созданием действий, которые происходят ПОСЛЕ того, как критерии выполнены (просто скрипт php запускается из задания cron).

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

По сути, они хотят запросить таблицу регистрации участников для задания cron на основе общего количества записей для данного agentID за заданный период времени.Однако проблема, которую я вижу, заключается в том, что задание cron не знает, что искать или как обрабатывать действия в цикле.

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

memberid     agentid     date_enrolled
12345       7           2010-10-17 12:00:00
39283       3           2010-10-17 12:00:00
33839       4           2010-10-17 12:00:00
44848       7           2010-10-18 12:00:00
38383       5           2010-10-17 12:00:00
38383       7           2010-10-19 12:00:00

Исходя из вышеизложенного, если еженедельное задание cron было выполнено, было бы обнаружено, что AgentID 7 является подарочной картой, поскольку он зарегистрировал 3 участника в течение текущей недели.Если бы я смотрел на это с точки зрения отдельного запроса, у меня не было бы проблем с построением, но, учитывая, что у нас более 300 агентов, и информация может сильно различаться, я не знаю, сработает ли «нужный метод».

Если бы это был мой путь, я думаю Я бы строил новую таблицу со счетчиком каждый раз, когда происходило зачисление, а затем просто создавал бы задания хрон, чтобы очистить целые столбцы после прохождения временного барьера (каждую неделю, очисткастолбец 2 и счетчик перезапусков, каждый месяц, очистить столбец 3 и счетчик перезапусков).

Есть ли способ построить скрипт и задание cron так, как хочет наша команда?

РЕДАКТИРОВАТЬ 1:

Исходя из требований команды, я полагаю, что мой предложенный sql-запрос будет содержать несколько длинных строк:

SELECT COUNT(AGENT) FROM tablename GROUP BY AGENT WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAY)

РЕДАКТИРОВАТЬ 2:

Не получаю много любви здесь;) Я решил сделать мой запрос более строгим, но мне трудно разобрать результаты, которые я первоначально думал, будет легко.Мне нужно использовать результаты, возвращаемые одним запросом в другой.

Цель: выбрать все из таблицы, в которой данные регистрации превышают 7 дней назад, сгруппировать по номеру оператора, имеющему число больше 3. Как только результатывозвращено, обновить поле уникального флага для КАЖДОЙ записи агента, возвращенной в наборе результатов из предыдущего запроса.

Мой начальный код:

$sql = $db->query("SELECT * FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAYS) GROUP BY agentid HAVING COUNT(*) >= 3");
            $result = $sql->fetchALL(PDO::FETCH_ASSOC);
            foreach($result as $key=>$val) {
                echo $key.' - '.$val.'<br />';
            }

РЕДАКТИРОВАТЬ 3 - "окончательный" сценарий?

<?php

    try {   
            $db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $db->beginTransaction();

            $sql = $db->query("SELECT AGENT FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 1 WEEK) GROUP BY AGENT HAVING COUNT(*) >= 10 ORDER BY enroll_date ASC");

            $result = $sql->fetchALL(PDO::FETCH_ASSOC);
            foreach($result as $key=>$val) {
                foreach($val as $ball=>$face) {
                    echo $ball." - ".$face.'<br />';

                    $sql2 = "UPDATE tablename2 SET bonus_set=?, method=? WHERE agentID = '$face'";

                    $stmt = $db->prepare($sql2);
                    $stmt->execute(array("Y", "free"));


                    //NEED TO FIGURE OUT HOW TO EMAIL THE ENTIRE LIST TO MYSELF next...

                }

            }       

            $db->commit();
            $db->null;
            exit;
        }

    catch (PDOException $e)
        {
            $db->rollback();
            echo $e->getMessage();

            exit;
        }
?>

1 Ответ

0 голосов
/ 20 октября 2010

Предлагаемый запрос будет работать с небольшим изменением перемещения GROUP BY AGENT в конец. Второе и третье правила будут следовать той же схеме.

Вы можете отслеживать награды в отдельной таблице (агент, награда, дата), чтобы избежать ситуаций, подобных тому, как кто-то квалифицируется пн-вс, а затем снова вторник-пн (двойной подсчет перекрывающихся дней). Можно ли выполнить объединение для этих таблиц или просто отдельный запрос, чтобы узнать, был ли агент уже награжден подарочными картами в течение последних семи дней и т. Д.

...