За последние 24 часа нас посетили 38285 программистов и 1722 робота. Сейчас ищут 602 программиста ...

Система заявок

Тема в разделе "Прочие вопросы по PHP", создана пользователем shreck, 17 фев 2009.

  1. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Нахожусь в ступоре.

    Нужно написать систему заявок. Т.е. клиент заходит на сайт, оставляет заявку. Заявке присваивается НОМЕР, ДАТА РЕГИСТРАЦИИ и др. параметры.
    Если через 2 дня после ДАТЫ РЕГИСТРАЦИИ никто на заявку не отреагировал - то нужно отправить уведомление мне на почту, что заявка не обработана.
    Если кто-то будет каждые 5 мин заходить на сайт и отслеживать их - то не проблема.
    Вот как это реализовать я понятия не имею.

    Мысль 1.
    Запускать скрипт через cron, который проверяет ВСЕ заявки в базе и отслеживает необработанные.
    Мне кажется нерациональным - гонять базу каждые 5 мин.

    Если есть идеи или кто сталкивался, поделитесь опытом.
     
  2. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    А зачем каждый пять минут, пусть скрипт раз в день проверяет это.
    Поясни про пять минут.
     
  3. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    А если у меня 3 000 000 заявок и все необработанные?
    Цикл будет бегать по 3 000 000 записей и проверять прошло ли 2 дня после регистрации заявки?

    Хочется последовательной обработки. Чтобы не 1000 писем сразу свалилось на ящик когда ты пришел в ПН на работу
     
  4. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Отдай задачу бегать по записям и проверять прошло ли два дня SQL серверу. если у тебя заявки в нем хранятся.
    Если нет, отработаны заявки отправляй в "архив",кстати такой механизм можно и при SQL использовать,правда не знаю сильный ли это даст выигрыш в быстродействии.

    Если сайт часто посещаемый то можно написать функцию аля если rnd(100)==50 "проверить все заявки".

    Но все же я бы реализовал на базе cron раз в 5 минут.
     
  5. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    MySql v.5.0.45 - посоветуй как?

    Т.е. бегать по всем записям, выбирать необработанные и выполнять функцию проверки?
     
  6. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Дай структуру таблицы отвечающей за заявки.
     
  7. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Структуры пока нет, но предполагаю что:

    INT id - ид заявки
    INT client_id - ид клиента
    INT manager_id - ид менеджера отвечающего за обработку ззаявки
    TINYINT(2) is_managed - отработана? 1/0
    TEXT composition - состав заявки
     
  8. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Время заявки забыл, сейчас напишу как я бы сделал.
     
  9. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    чорт ) бывает
     
  10. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    [sql]CREATE TABLE `demands` (
    `id` int(11) NOT NULL auto_increment,
    `client_id` int(11) NOT NULL,
    `manager_id` int(11) NOT NULL,
    `is_managed` tinyint(2) NOT NULL,
    `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;[/sql]

    Код (Text):
    1. 'SELECT * FROM `demands` where (now()-`date`)>172800 AND `is_managed`=0'
    172800 это кол-во секунд в двух днях.
     
  11. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Можно добавить поле estimate_date - и писать в него сразу при появлении заявки now() + 2 дня. Мало ли, потом появится тип заявок которые надо обрабатывать за сутки?

    PHP:
    1. <? $query_text = "select id, client_id, manager_id  from requests where where now()> estimate_date and is_managed=0";
    2. $result=mysql_query($query_text);
    3. $mailtext="";
    4. while ($row=mysql_assoc_array($query)){
    5. $mailtext.="мудак манагер ".$row['manager_id']." не обработал заявку ".$row['id']." от клиента ".$row['client_id']."\n\r";
    6. }
    7.  
    после чего посылаешь этот $mailtext одним письмом :) Цикл обрабатывает только найденные в базе.
     
  12. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Ок. Спасибо.
    Вывод: без crontab никуда. Придется обрабатывать необработанные заявки скриптом каждые 5 мин.
     
  13. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Еще добавляем время обработки заявки, надо же посмотреть кто из менеджеров филонит.
    А по уму мне кажется надо разделить обработаные заявки и не обработаные по разным таблицам
     
  14. Ни в коем случае.
     
  15. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Зачем? Каждый раз когда манагер обработает заявку делать delete из одной таблицы и insert в другую вместо update одного поля?
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Не надо так писать, MySQL в таком случае высчитывает выражение слева для каждой записи. Нужно делать так:
    [SQL]
    SELECT * FROM `demands` WHERE `is_managed` = 0 AND `date` > NOW() - INTERVAL 2 DAY
    [/SQL]
    Таким образом NOW() - INTERVAL 2 DAY будет высчитан один раз оптимизатором и подставлен в запрос в виде константного выражения.
     
  17. shreck

    shreck Активный пользователь

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Всем спасибо!