当前位置:首页 > 行业动态 > 正文

按月和年的PHP SQL事件

使用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 ...;               -
0