phpenv 在 windows 下无法使用 crontab,必须用任务计划程序调用 php cli 脚本;需写死 php 和 mysqldump 绝对路径,配置 .my.cnf 存密并设权限,任务起始于脚本目录,以当前用户运行,并校验备份完整性。

phpEnv 是 Windows 下的集成环境(类似 XAMPP),默认不自带 cron 或 systemd,也无法直接用 crontab。想实现 MySQL 自动备份,必须绕过 Linux 式定时机制,改用 Windows 原生任务计划程序 + PHP CLI 脚本组合,且要特别注意路径、权限和执行上下文问题。
为什么不能直接套用 Linux 的 crontab 脚本
phpEnv 运行在 Windows 上,crontab 命令不存在;即使装了 WSL,phpEnv 本身是 Windows 进程,其 PHP 不会自动继承 WSL 环境。你写的 crontab -e 或 0 2 * * * /path/to/backup.php 在 phpEnv 下完全无效。
- Windows 任务计划程序(Task Scheduler)才是唯一可靠入口
- PHP 脚本必须用完整绝对路径调用,例如
C:\phpenv\php\php-8.2.12\php.exe,不能只写php - 脚本中所有路径(如备份目录、
mysqldump路径)必须用 Windows 风格的反斜杠或正斜杠,且不能含空格或中文(否则 shell_exec 失败) - phpEnv 默认禁用
exec/shell_exec,需手动开启
如何让 PHP 脚本能调用 mysqldump
phpEnv 自带 MySQL,但 mysqldump.exe 不在系统 PATH 中,PHP 脚本里必须写死全路径,否则报错 'mysqldump' is not recognized as an internal or external command。
- 先确认位置:通常为
C:\phpenv\mysql\mysql-8.0.33\bin\mysqldump.exe(版本号可能不同,进目录看) - 不要用
which mysqldump—— Windows 没这命令;改用资源管理器或dir C:\phpenv\mysql\*\bin\mysqldump.exe /s - 密码绝不能拼在命令行里:
shell_exec("C:/phpenv/mysql/.../mysqldump.exe -u root -p123456 db > ...")会导致密码出现在进程列表中,被任意用户用任务管理器看到 - 正确做法:创建
C:\phpenv\.my.cnf,内容为:[client] user=root password=your_strong_password host=127.0.0.1 port=3306
然后设权限:右键该文件 → 属性 → 安全 → 编辑 → 仅保留 Administrators 和当前用户可读,其他全删
- 调用时用:
C:/phpenv/mysql/.../mysqldump.exe --defaults-file=C:/phpenv/.my.cnf --single-transaction --routines --triggers mydb > C:/backup/mydb_20260418.sql
Windows 任务计划程序怎么配才不失败
90% 的失败源于“启动目录”和“用户上下文”不匹配:任务默认以 SYSTEM 用户运行,看不到你的 .my.cnf,也无权写 C:\backup。
- 触发器选“每天”,起始时间填实际希望的备份时刻(如 02:00)
- 操作 → “启动程序”:
- 程序或脚本:
C:\phpenv\php\php-8.2.12\php.exe(必须是 phpEnv 自带的 PHP,不是系统 PATH 里的) - 参数:
C:\phpenv\scripts\backup.php - 起始于:
C:\phpenv\scripts\(关键!否则相对路径全错)
- 程序或脚本:
- “常规”选项卡 → 勾选“不管用户是否登录都要运行”+“不存储密码” → 点“更改用户或组”,输入你的 Windows 登录用户名(不是 Administrator),点“检查名称”确认
- 务必取消勾选“只在计算机使用交流电源时运行”(笔记本用户易踩)
- 运行后去“历史记录”页看状态码:0x0 = 成功,0x1 = 权限/路径错误,0xC0000005 = 访问冲突(常见于 .my.cnf 权限太松)
备份脚本里最容易漏掉的三件事
很多脚本能生成文件但恢复不了——因为导出不完整,或根本没校验结果。
-
--single-transaction只对 InnoDB 有效;如果库含 MyISAM 表,得加--lock-all-tables,否则备份期间写入会丢失 - 缺
--routines --triggers --events:存储过程、触发器、事件不会被导出,恢复后功能缺失 - 没检查返回值和文件大小:
$output = shell_exec($cmd . ' 2>&1'); if (empty($output) && file_exists($file) && filesize($file) > 1024) { /* ok */ };否则空文件或半截 SQL 你也以为成功了
Windows 下没有 find ... -mtime,删旧备份得用 PowerShell 命令或 PHP 的 glob() + filemtime() 手动遍历,别指望一行 shell 解决。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











