You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MySQL(MariaDB)每8秒执行PHP文件更新卡塔尔2022赛事数据?

解决每8秒执行PHP更新赛事数据的问题

你当前方法的问题

  1. sys_exec函数不可用:这是MySQL的用户定义函数(UDF),Windows环境下默认未安装,MariaDB在Windows上对这类UDF的支持也很有限,直接调用会报错。
  2. 事件仅执行一次:你的SQL里用了AT CURRENT_TIMESTAMP,这个事件只会在当前时间触发一次,不会重复执行。
  3. 命令拼接错误:PHP解释器路径和脚本路径之间没有空格,系统无法识别两个独立参数,导致执行失败。
  4. 事件调度器可能未开启:MySQL/MariaDB的事件调度器默认可能处于关闭状态,需手动开启才能运行事件。

推荐解决方案(分环境)

一、Windows+XAMPP本地环境

优先使用Windows任务计划程序,比MySQL事件更可靠:

  • 打开「任务计划程序」,点击「创建基本任务」
  • 命名为“卡塔尔赛事数据更新”,下一步
  • 触发器选择「每天」,后续设置重复间隔为8秒,持续时间选「无限」,下一步
  • 操作选择「启动程序」,在「程序或脚本」中填入PHP绝对路径:C:\xampp\php\php.exe
  • 在「添加参数(可选)」中填入脚本绝对路径(注意加引号避免路径含空格):"C:\xampp\htdocs\qatar\qatarjob1.php"
  • 完成后确保任务处于启用状态,即可每8秒执行一次PHP脚本。

如果非要尝试MySQL事件(不推荐):

  1. 先开启事件调度器:
    SET GLOBAL event_scheduler = ON;
    
    要永久生效,需修改XAMPP的MySQL配置文件my.ini,添加event_scheduler=ON后重启MySQL。
  2. 修正事件代码(补充空格和重复调度规则):
    DELIMITER @@
    CREATE EVENT insert_imediato
    ON SCHEDULE EVERY 8 SECOND STARTS CURRENT_TIMESTAMP
    DO
    BEGIN
        DECLARE cmd CHAR(255);
        DECLARE result INT(10);
        -- 路径间加空格,脚本路径加引号避免空格问题
        SET cmd=CONCAT('"C:\xampp\php\php.exe" ', '"C:\xampp\htdocs\qatar\qatarjob1.php"');
        -- 前提是已安装sys_exec UDF,否则此行会报错
        SET result = sys_exec(cmd);
    END @@
    DELIMITER ;
    
    但Windows下安装sys_exec UDF步骤繁琐且有安全风险,不建议使用。

二、服务器部署(Linux环境)

优先用Cron+循环脚本,因为Cron最小单位是分钟,需借助循环实现8秒间隔:

  1. 创建shell脚本update_qatar.sh:
    #!/bin/bash
    while true; do
        # 替换为你的PHP路径和脚本路径
        /usr/bin/php /var/www/html/qatar/qatarjob1.php
        sleep 8
    done
    
  2. 给脚本添加执行权限:
    chmod +x update_qatar.sh
    
  3. 设置后台运行或开机启动:
    用nohup ./update_qatar.sh &让脚本后台运行,或配置systemd服务保证进程异常时自动重启。

如果用MySQL事件(Linux环境相对可行):

  1. 确保sys_exec UDF已安装(多数服务器版本自带或可通过包管理安装)
  2. 开启事件调度器(同Windows步骤,修改my.cnf)
  3. 编写事件:
    DELIMITER @@
    CREATE EVENT insert_imediato
    ON SCHEDULE EVERY 8 SECOND STARTS CURRENT_TIMESTAMP
    DO
    BEGIN
        DECLARE cmd CHAR(255);
        DECLARE result INT(10);
        SET cmd=CONCAT('/usr/bin/php ', '/var/www/html/qatar/qatarjob1.php');
        SET result = sys_exec(cmd);
    END @@
    DELIMITER ;
    

注意事项

  • 系统级定时任务(任务计划、Cron)比MySQL事件更稳定,还能避免UDF带来的安全风险。
  • 提前测试PHP脚本在命令行下的运行情况(直接执行php 脚本路径),避免依赖Web环境的变量(如$_SERVER)。

内容的提问来源于stack exchange,提问作者tiago calado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:35:20