phpEnv 在 Windows 下无法使用 crontab,必须用任务计划程序调用 PHP CLI 脚本;需写死 PHP 和 mysqldump 绝对路径,配置 .my.cnf 存密并设权限,任务起始于脚本目录,以当前用户运行,并校验备份完整性。
php
Env 是 Windows 下的集成环境(类似 XAMPP),默认不自带 cron 或 systemd,也无法直接用
。想实现 MySQL 自动备份,必须绕过 Linux 式定时机制,改用 Windows 原生任务计划程序 + PHP CLI 脚本组合,且要特别注意路径、权限和执行上下文问题。
为什么不能直接套用 Linux 的 crontab 脚本
phpEnv 运行在 Windows 上,
命令不存在;即使装了 WSL,phpEnv 本身是 Windows 进程,其 PHP 不会自动继承 WSL 环境。你写的
或
在 phpEnv 下完全无效。
Windows 任务计划程序(Task Scheduler)才是唯一可靠入口
PHP 脚本必须用完整绝对路径调用,例如
,不能只写
脚本中所有路径(如备份目录、
路径)必须用 Windows 风格的反斜杠或正斜杠,且不能含空格或中文(否则 shell_exec 失败)
phpEnv 默认禁用
/
,需手动开启
如何让 PHP 脚本能调用
mysql
dump
phpEnv 自带 MySQL,但
不在系统 PATH 中,PHP 脚本里必须写死全路径,否则报错
。
先确认位置:通常为
(版本号可能不同,进目录看)
不要用
—— Windows 没这命令;改用资源管理器或
密码绝不能拼在命令行里:
会导致密码出现在进程列表中,被任意用户用任务管理器看到
正确做法:创建
,内容为:
然后设权限:右键该文件 → 属性 → 安全 → 编辑 → 仅保留 Administrators 和当前用户可读,其他全删
调用时用:
Windows 任务计划程序怎么配才不失败
90% 的失败源于“启动目录”和“用户上下文”不匹配:任务默认以 SYSTEM 用户运行,看不到你的
,也无权写
。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
触发器选“每天”,起始时间填实际希望的备份时刻(如 02:00)
操作 → “启动程序”:
程序或脚本:
(必须是 phpEnv 自带的 PHP,不是系统 PATH 里的)
参数:
起始于:
(关键!否则相对路径全错)
“常规”选项卡 → 勾选“不管用户是否登录都要运行”+“不存储密码” → 点“更改用户或组”,输入你的 Windows 登录用户名(不是 Administrator),点“检查名称”确认
务必取消勾选“只在计算机使用交流电源时运行”(笔记本用户易踩)
运行后去“历史记录”页看状态码:0x0 = 成功,0x1 = 权限/路径错误,0xC0000005 = 访问冲突(常见于 .my.cnf 权限太松)
备份脚本里最容易漏掉的三件事
很多脚本能生成文件但恢复不了——因为导出不完整,或根本没校验结果。
只对 InnoDB 有效;如果库含 MyISAM 表,得加
,否则备份期间写入会丢失
缺
:存储过程、触发器、事件不会被导出,恢复后功能缺失
没检查返回值和文件大小:
;否则空文件或半截 SQL 你也以为成功了
Windows 下没有
,删旧备份得用 PowerShell 命令或 PHP 的
+
手动遍历,别指望一行 shell 解决。
crontabcrontabcrontab -e0 2 * * * /path/to/backup.phpC:\phpenv\php\php-8.2.12\php.exephpmysqldumpexecshell_execmysqldump.exe'mysqldump' is not recognized as an internal or external commandC:\phpenv\mysql\mysql-8.0.33\bin\mysqldump.exewhich mysqldumpdir C:\phpenv\mysql\*\bin\mysqldump.exe /sshell_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=3306C:/phpenv/mysql/.../mysqldump.exe --defaults-file=C:/phpenv/.my.cnf --single-transaction --routines --triggers mydb > C:/backup/mydb_20260418.sql.my.cnfC:\backupC:\phpenv\php\php-8.2.12\php.exeC:\phpenv\scripts\backup.phpC:\phpenv\scripts\--single-transaction--lock-all-tables--routines --triggers --events$output = shell_exec($cmd . ' 2>&1'); if (empty($output) && file_exists($file) && filesize($file) > 1024) { /* ok */ }find ... -mtimeglob()filemtime()