Mysql има своята EVENT функционалност за избягване на сложни взаимодействия с cron, когато голяма част от това, което планирате, е свързано с sql и по-малко свързано с файл. Вижте страницата наръчник тук . Надяваме се по-долу да се чете като бърз преглед на важните стъпки и неща, които трябва да се вземат предвид, както и тестване, което може да се провери.
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
опа, планировчикът на събития не е включен. Нищо няма да се задейства.
SET GLOBAL event_scheduler = ON; -- turn her on and confirm below
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
Схема за тестване
create table theMessages
( id int auto_increment primary key,
userId int not null,
message varchar(255) not null,
updateDt datetime not null,
key(updateDt)
-- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');
Създайте 2 събития, 1-во бягане ежедневно, 2-ро бягане на всеки 10 минути
Игнорирайте какво всъщност правят (играят един срещу друг). Въпросът е в time difference
подходи и сначване .
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
-- etc etc all your stuff in here
END;$$
DELIMITER ;
...
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)
-- etc etc all your stuff in here
END;$$
DELIMITER ;
Показване на състояния на събития (различни подходи)
show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from mysql> prompt
*************************** 1. row ***************************
Db: so_gibberish
Name: delete7DayOldMessages
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: DAY
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Db: so_gibberish
Name: Every_10_Minutes_Cleanup
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 10
Interval field: MINUTE
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.06 sec)
Случайни неща за разглеждане
drop event someEventName;
-- <----- хубаво е да знаете за
не може да се използва псевдоним datediff и се използва клауза where в 1 ред, така че
select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;
по-точно, 168 часа за 1 седмица на възраст
select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
| 1 | 410 |
| 2 | 301 |
| 3 | 169 |
| 4 | 167 |
+----+------------+
Връзката към ръчната страница показва доста гъвкавост с избор на интервали, показани по-долу:
интервал:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Конкурентност
Вграждане на всички необходими мерки за едновременност, за да може множество събития (или множество задействания на едно и също събитие) да не доведат до безумие на данните.
Задайте и забравете
Помнете, засега, защото ще го забравите, че тези събития просто продължават да стрелят. Така че вградете солиден код, който просто ще продължи да работи, дори когато забравите. Което най-вероятно ще направите.
Вашите конкретни изисквания
Трябва да определите кои редове трябва да бъдат изтрити първо от таблица, така че да спазва ограниченията на първичния ключ. Просто ги подредете в правилен ред в очевидната област чрез израза CREATE EVENT, който може да бъде огромен.