如何让MySQL(MariaDB)每8秒执行PHP文件更新卡塔尔2022赛事数据?
解决每8秒执行PHP更新赛事数据的问题
你当前方法的问题
sys_exec函数不可用:这是MySQL的用户定义函数(UDF),Windows环境下默认未安装,MariaDB在Windows上对这类UDF的支持也很有限,直接调用会报错。- 事件仅执行一次:你的SQL里用了
AT CURRENT_TIMESTAMP,这个事件只会在当前时间触发一次,不会重复执行。 - 命令拼接错误:PHP解释器路径和脚本路径之间没有空格,系统无法识别两个独立参数,导致执行失败。
- 事件调度器可能未开启:MySQL/MariaDB的事件调度器默认可能处于关闭状态,需手动开启才能运行事件。
推荐解决方案(分环境)
一、Windows+XAMPP本地环境
优先使用Windows任务计划程序,比MySQL事件更可靠:
- 打开「任务计划程序」,点击「创建基本任务」
- 命名为“卡塔尔赛事数据更新”,下一步
- 触发器选择「每天」,后续设置重复间隔为8秒,持续时间选「无限」,下一步
- 操作选择「启动程序」,在「程序或脚本」中填入PHP绝对路径:
C:\xampp\php\php.exe - 在「添加参数(可选)」中填入脚本绝对路径(注意加引号避免路径含空格):
"C:\xampp\htdocs\qatar\qatarjob1.php" - 完成后确保任务处于启用状态,即可每8秒执行一次PHP脚本。
如果非要尝试MySQL事件(不推荐):
- 先开启事件调度器:
要永久生效,需修改XAMPP的MySQL配置文件SET GLOBAL event_scheduler = ON;my.ini,添加event_scheduler=ON后重启MySQL。 - 修正事件代码(补充空格和重复调度规则):
但Windows下安装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 ;sys_execUDF步骤繁琐且有安全风险,不建议使用。
二、服务器部署(Linux环境)
优先用Cron+循环脚本,因为Cron最小单位是分钟,需借助循环实现8秒间隔:
- 创建shell脚本
update_qatar.sh:#!/bin/bash while true; do # 替换为你的PHP路径和脚本路径 /usr/bin/php /var/www/html/qatar/qatarjob1.php sleep 8 done - 给脚本添加执行权限:
chmod +x update_qatar.sh - 设置后台运行或开机启动:
用nohup ./update_qatar.sh &让脚本后台运行,或配置systemd服务保证进程异常时自动重启。
如果用MySQL事件(Linux环境相对可行):
- 确保
sys_execUDF已安装(多数服务器版本自带或可通过包管理安装) - 开启事件调度器(同Windows步骤,修改
my.cnf) - 编写事件:
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
相关产品推荐
相关产品推荐

