xampp中php的exec()默认被禁用,需修改php.ini中disable_functions并重启apache;windows下须用cmd.exe /c调用命令,注意路径、权限、编码及错误流捕获。

PHP exec() 在 XAMPP 中默认被禁用
XAMPP 默认在 php.ini 中禁用了 exec、shell_exec、system 等函数,直接调用会返回空或 null,且无明确报错。这不是 PHP 语法问题,而是安全策略限制。
确认是否禁用:在 PHP 脚本中运行 var_dump(ini_get('disable_functions'));,若输出包含 exec,shell_exec,system,passthru,就说明被锁死了。
- 修改前务必备份
php.ini(通常位于XAMPPphpphp.ini) - 搜索
disable_functions =,删掉exec、shell_exec、system、passthru等项(保留其他如proc_open或curl_exec视需求而定) - 改完后必须重启 Apache(通过 XAMPP Control Panel),否则不生效
- Windows 下注意路径分隔符:用
\或正斜杠/,避免单反斜杠被转义
Windows 命令执行需显式调用 cmd.exe /c
PHP 的 exec() 在 Windows 上不直接识别 DOS 命令(如 dir、ping),必须通过 cmd.exe 解释器中转,否则会提示“不是内部或外部命令”。
例如:exec('dir') 失败,但 exec('cmd.exe /c dir', $output) 可返回目录列表。
-
/c表示执行后关闭 cmd 窗口;/k会保持窗口打开(调试可用,生产环境慎用) - 含空格的路径必须加英文双引号,比如
exec('cmd.exe /c "C:\Program Files\7-Zip\7z.exe" a archive.7z file.txt') - 避免使用交互式命令(如
pause、more),PHP 进程不会等待用户输入 - 命令超时默认无限制,建议配合
set_time_limit(30)防止卡死
权限与当前工作目录影响结果一致性
XAMPP 的 Apache 服务默认以 Windows 的 SYSTEM 账户或你手动配置的服务账户运行,它可能没有访问某些磁盘路径、网络资源或注册表的权限——这会导致命令看似执行了,但输出为空或报错(如 Access is denied)。
同时,exec() 的当前工作目录是 Apache 的启动路径(通常是 XAMPPpachein),不是你的 PHP 脚本所在目录,所以相对路径容易出错。
- 用
getcwd()打印当前路径,确认执行上下文 - 所有路径尽量用绝对路径,或先
chdir('D:\myproject');切换到目标目录再执行 - 测试权限:尝试
exec('cmd.exe /c echo test > C:\test.txt'),看文件是否生成 - 若需访问网络共享或映射盘符(如
Z:),Apache 服务必须以有对应权限的用户身份运行(控制面板 → Apache → Config → Service → Log On → This account)
捕获完整输出和错误信息要用对函数组合
exec() 只返回最后一行,shell_exec() 返回全部 stdout,但都拿不到 stderr。要调试失败命令,必须重定向错误流。
例如:$output = shell_exec('ping google.com 2>&1'); 把 stderr 合并进 stdout;或者用 exec('ping google.com 2>&1', $lines, $return_code) 获取逐行输出和退出码。
-
$return_code是关键:0 通常表示成功,非 0 表示出错(如 ping 不通是 1,命令不存在是 9009) - Windows 下部分命令(如
robocopy)退出码含义复杂,建议查其文档,不要只判断是否为 0 - 敏感命令(如
del、format)务必先在 cmd 中手动验证逻辑,再移植到 PHP - 输出内容含中文时,注意 cmd 默认编码是 GBK,PHP 文件若为 UTF-8,需用
iconv('GBK', 'UTF-8', $output)转码
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











