phpenv中mysql事件调度器默认不工作,因其my.ini未配置event_scheduler=on,需手动添加并重启服务;windows下清理需用php脚本+任务计划,适配路径、权限与时区。

phpEnv 是 Windows 下的集成环境,自带 MySQL,但默认不启用事件调度器、不预装 cron 服务,也不能直接用 Linux 的 find -mtime 清理文件——所以照搬 Linux 运维脚本会失败。必须用 PHP 脚本 + Windows 任务计划程序(Task Scheduler)组合实现,且所有路径、权限、时区都要重新适配。
phpEnv 中 MySQL 事件调度器为什么默认不工作?
phpEnv 启动的 MySQL 实例默认关闭 event_scheduler,即使你执行 SET GLOBAL event_scheduler = ON,重启后也会失效,因为配置没写进 my.ini。
- 打开 phpEnv 安装目录下的
mysql\bin\my.ini(不是etc\下那个) - 在
[mysqld]段落下添加一行:event_scheduler = ON - 重启 phpEnv 的 MySQL 服务(必须重启,仅 reload 不生效)
- 验证是否生效:
mysql -uroot -proot -e "SHOW VARIABLES LIKE 'event_scheduler';",返回ON才算成功
注意:phpEnv 的 MySQL 默认以 root/root 登录,无 socket 路径,不能用 -S 参数;连接时用 -h127.0.0.1 -P3306 更稳。
Windows 下怎么安全执行 DELETE 分批清理?
直接在 PHP 脚本里用 mysqli_query() 执行大范围 DELETE 容易超时、卡住 phpEnv 控制台,还可能因事务未提交导致锁表。必须控制单次行数、加 sleep、手动 commit。
- SQL 必须带
ORDER BY id LIMIT 1000,否则 MySQL 8.0+ 会报错“DELETE with LIMIT and no ORDER BY is deprecated” - 每次执行后检查
mysqli_affected_rows(),为 0 就退出循环 - 每删 1000 行后
usleep(100000)(0.1 秒),避免拖慢 phpEnv 响应其他请求 - 务必在事务外执行,或显式
START TRANSACTION; ... COMMIT;,防止长事务堆积
示例片段:
for ($i = 0; ; $i++) {
$sql = "DELETE FROM logs WHERE created_at <h3>备份文件清理为什么 find 命令总报错?</h3><p>Windows 命令行不支持 Linux 的 <code>find -mtime</code>,phpEnv 自带的 bash(Git Bash 或 MinGW)又常缺 <code>date</code> 命令或时区解析能力,硬套 shell 脚本会失败。</p>
- 改用 PHP 原生函数清理:
scandir()+filemtime()+unlink() - 注意路径分隔符:Windows 用
\,但 PHP 中建议统一用/或DIRECTORY_SEPARATOR - 备份文件名必须含标准时间格式(如
backup_20260419.sql.gz),否则无法按日期判断新旧 - 删除前先
chmod($file, 0777),Windows NTFS 权限有时会阻止删除
关键逻辑示例:
$backup_dir = 'D:/phpEnv/MySQL/data_backup/';
$files = array_filter(scandir($backup_dir), function($f) { return strpos($f, '.sql.gz') !== false; });
foreach ($files as $file) {
$path = $backup_dir . $file;
if (filemtime($path) <h3>Windows 任务计划里调用 PHP 脚本的坑</h3><p>直接双击能跑的 PHP 脚本,在任务计划里常报“找不到 <a style="color:#f60; text-decoration:underline;" title="mysql" href="https://m.php.cn/zt/15713.html" target="_blank">mysql</a> 扩展”或“mysqli_connect(): php_network_getaddresses: getaddrinfo failed”,本质是环境不一致。</p>
- PHP 脚本开头必须用绝对路径调用 php.exe:
C:\phpEnv\php\php.exe D:\scripts\clean.php - 任务计划中“起始于”字段必须填脚本所在目录(不是 php.exe 目录),否则
require会失败 - 勾选“不管用户是否登录都要运行”,并选“不保存密码”——否则任务会因用户未登录而跳过
- 日志输出重定向到文件:
C:\phpEnv\php\php.exe D:\scripts\clean.php >> D:\logs\clean.log 2>&1
最麻烦的是时区:phpEnv 的 PHP 默认时区是 UTC,MySQL 的 time_zone 可能是 SYSTEM(即系统本地时间),NOW() 和 date('Y-m-d') 可能差 8 小时。务必在脚本开头统一设为:date_default_timezone_set('Asia/Shanghai');,并在 MySQL 中执行 SET time_zone = '+08:00';。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











