上一篇
按月和年的PHP SQL事件
- 行业动态
- 2025-05-17
- 2
使用MySQL事件调度器,通过PHP执行 SQL创建按月/年触发的定时任务,如
CREATE EVENT IF NOT EXISTS event_name ON SCHEDULE EVERY 1 MONTH/YEAR
,需
MySQL事件调度器基础
MySQL的EVENT
调度器允许在指定时间自动执行SQL语句,需确保服务器启用了event_scheduler
系统变量:
SET GLOBAL event_scheduler = ON;
按月执行的SQL事件
场景示例
每月1号凌晨清理上月日志数据
创建事件SQL
CREATE EVENT IF NOT EXISTS clean_logs_monthly ON SCHEDULE AT TIME '00:00:00' -精确到分秒 EVERY 1 MONTH STARTS '2023-10-01 00:00:00' -首次执行时间 ENDS '2099-12-31 00:00:00' -结束时间(可选) DO DELETE FROM logs WHERE log_date < DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
PHP实现代码
<?php $mysqli = new mysqli("localhost", "user", "pass", "database"); // 检查事件是否存在 $result = $mysqli->query("SHOW EVENTS LIKE 'clean_logs_monthly'"); if (!$result->num_rows) { // 创建新事件 $sql = " CREATE EVENT clean_logs_monthly ON SCHEDULE EVERY 1 MONTH STARTS '{$startDate}' ENDS '2099-12-31' DO DELETE FROM logs WHERE log_date < DATE_SUB(CURDATE(), INTERVAL 1 MONTH)"; $mysqli->query($sql); } ?>
按年执行的SQL事件
场景示例
每年1月1日统计年度销售数据
创建事件SQL
CREATE EVENT IF NOT EXISTS annual_sales_report ON SCHEDULE EVERY 1 YEAR STARTS '2024-01-01 00:00:00' ENDS '2099-12-31' DO INSERT INTO annual_reports (year, total_sales) SELECT YEAR(CURDATE()), SUM(amount) FROM sales WHERE YEAR(sale_date) = YEAR(CURDATE());
单元表格对比
特性 | 按月事件 | 按年事件 |
---|---|---|
调度频率 | EVERY 1 MONTH | EVERY 1 YEAR |
典型时间表达式 | DATE_SUB(CURDATE(), INTERVAL 1 MONTH) | YEAR(CURDATE()) |
适用场景 | 月度数据清理、账单生成 | 年度统计、财务报告 |
时间精度 | 通常按天(如每月1号) | 通常按年(如每年1月1号) |
PHP管理事件通用函数
function manageEvent($action, $eventName, $sql) { $mysqli = new mysqli("localhost", "user", "pass", "database"); if ($action == 'create') { $mysqli->query("DROP EVENT IF EXISTS `$eventName`"); $mysqli->query("CREATE EVENT `$eventName` ON SCHEDULE $sql"); } elseif ($action == 'drop') { $mysqli->query("DROP EVENT IF EXISTS `$eventName`"); } } // 示例调用:创建月度事件 manageEvent('create', 'monthly_backup', "EVERY 1 MONTH STARTS NOW DO ...");
相关问题与解答
Q1:如何查看当前所有事件?
SHOW FULL PROCESSLIST; -查看正在运行的事件 SHOW EVENTS; -查看所有事件定义
Q2:如何修改已有事件的调度时间?
ALTER EVENT event_name ON SCHEDULE AT TIME '新时间' -修改执行时间 MODIFIES ...; -