Нахожусь в ступоре. Нужно написать систему заявок. Т.е. клиент заходит на сайт, оставляет заявку. Заявке присваивается НОМЕР, ДАТА РЕГИСТРАЦИИ и др. параметры. Если через 2 дня после ДАТЫ РЕГИСТРАЦИИ никто на заявку не отреагировал - то нужно отправить уведомление мне на почту, что заявка не обработана. Если кто-то будет каждые 5 мин заходить на сайт и отслеживать их - то не проблема. Вот как это реализовать я понятия не имею. Мысль 1. Запускать скрипт через cron, который проверяет ВСЕ заявки в базе и отслеживает необработанные. Мне кажется нерациональным - гонять базу каждые 5 мин. Если есть идеи или кто сталкивался, поделитесь опытом.
А если у меня 3 000 000 заявок и все необработанные? Цикл будет бегать по 3 000 000 записей и проверять прошло ли 2 дня после регистрации заявки? Хочется последовательной обработки. Чтобы не 1000 писем сразу свалилось на ящик когда ты пришел в ПН на работу
Отдай задачу бегать по записям и проверять прошло ли два дня SQL серверу. если у тебя заявки в нем хранятся. Если нет, отработаны заявки отправляй в "архив",кстати такой механизм можно и при SQL использовать,правда не знаю сильный ли это даст выигрыш в быстродействии. Если сайт часто посещаемый то можно написать функцию аля если rnd(100)==50 "проверить все заявки". Но все же я бы реализовал на базе cron раз в 5 минут.
MySql v.5.0.45 - посоветуй как? Т.е. бегать по всем записям, выбирать необработанные и выполнять функцию проверки?
Структуры пока нет, но предполагаю что: INT id - ид заявки INT client_id - ид клиента INT manager_id - ид менеджера отвечающего за обработку ззаявки TINYINT(2) is_managed - отработана? 1/0 TEXT composition - состав заявки
[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): 'SELECT * FROM `demands` where (now()-`date`)>172800 AND `is_managed`=0' 172800 это кол-во секунд в двух днях.
Можно добавить поле estimate_date - и писать в него сразу при появлении заявки now() + 2 дня. Мало ли, потом появится тип заявок которые надо обрабатывать за сутки? PHP: <? $query_text = "select id, client_id, manager_id from requests where where now()> estimate_date and is_managed=0"; $result=mysql_query($query_text); $mailtext=""; while ($row=mysql_assoc_array($query)){ $mailtext.="мудак манагер ".$row['manager_id']." не обработал заявку ".$row['id']." от клиента ".$row['client_id']."\n\r"; } после чего посылаешь этот $mailtext одним письмом Цикл обрабатывает только найденные в базе.
Ок. Спасибо. Вывод: без crontab никуда. Придется обрабатывать необработанные заявки скриптом каждые 5 мин.
Еще добавляем время обработки заявки, надо же посмотреть кто из менеджеров филонит. А по уму мне кажется надо разделить обработаные заявки и не обработаные по разным таблицам
Зачем? Каждый раз когда манагер обработает заявку делать delete из одной таблицы и insert в другую вместо update одного поля?
Не надо так писать, MySQL в таком случае высчитывает выражение слева для каждой записи. Нужно делать так: [SQL] SELECT * FROM `demands` WHERE `is_managed` = 0 AND `date` > NOW() - INTERVAL 2 DAY [/SQL] Таким образом NOW() - INTERVAL 2 DAY будет высчитан один раз оптимизатором и подставлен в запрос в виде константного выражения.