使用PHP恢复SQL文件失败 排查是否为XAMPP配置问题
问题原因排查方向
1. 命令本身语法错误
你编写的PHP代码中调用的mysql命令和shell执行的命令存在明显差异:
- 手动执行的shell命令没有加
-p参数(说明root账户未设置密码),也没有指定数据库名 - PHP代码中的命令加了
-p参数,还多了is2020_db参数,这里存在两个语法问题:-p参数后直接写密码不能加空格,加空格会将后续的is2020_db识别为密码,而非目标数据库名- 若root账户没有密码,添加
-p参数会触发交互式密码输入,exec调用时无法完成输入,直接执行失败
2. 文件路径不匹配
PHP执行时的工作目录和你手动运行shell的目录不一致,导致系统找不到Triggers.sql文件。建议用绝对路径指定sql文件位置,比如/opt/lampp/htdocs/your_project/Triggers.sql(Linux)或者C:\xampp\htdocs\your_project\Triggers.sql(Windows)这类完整路径。
3. PHP禁用了exec函数
XAMPP默认的php.ini配置可能会将exec、shell_exec等存在安全风险的函数加入disable_functions列表。你可以打印phpinfo()查看对应配置项,如果exec在禁用列表中,移除后重启Apache即可。
4. 运行用户权限不足
手动运行shell时用的是当前登录系统的用户权限,而XAMPP的Apache运行时用的是daemon、www-data这类专门的web服务用户,该用户可能没有权限调用mysql命令,或是没有权限读取Triggers.sql文件。你可以将whoami命令放到exec中执行,打印输出确认运行用户,再给对应用户赋予相关文件、命令的访问权限。
5. mysql命令路径未识别
手动运行shell时系统能正常找到mysql命令的路径,但PHP运行时的PATH环境变量没有包含mysql所在目录,你可以替换为mysql命令的绝对路径,XAMPP下mysql默认路径一般为/opt/lampp/bin/mysql(Linux)或者C:\xampp\mysql\bin\mysql.exe(Windows)。
修复后示例代码
// 替换为你实际的mysql路径、sql文件绝对路径、数据库名,无密码直接去掉-p参数即可 $command = '/opt/lampp/bin/mysql -u root is2020_db < /opt/lampp/htdocs/test/Triggers.sql'; // 新增参数获取返回值和执行输出,方便排查错误 exec($command, $output, $return_var); // 执行成功时return_var为0,非0即为执行失败,可通过output查看错误信息 var_dump($output, $return_var);
内容的提问来源于stack exchange,提问作者Angelo Fernandez

