我正在尝试使用 exec()从PHP运行一些命令,它似乎只适用于我的Windows环境变量中定义的某些命令,但并非适用于所有命令。
在我的命令提示符下,我可以从任何路径成功运行所有这些命令(C:\或E:\ whatever)
> pear -V // ... "PEAR Version: 1.9.5" ...
> dot -V // dot - graphviz version 2.38.0 (20140413.2041)
> phpdoc -V // phpDocumentor version 2.8.1
所有这些都为每个指定的程序返回正确的版本,这意味着环境变量配置得很好。
但是在PHP中我只能运行一些命令,其余的命令都会失败:
$out = array();
$ret = '';
exec('pear -V', $out, $ret);
echo var_dump($out); // $ret = 0, $out = array ..."PEAR Version: 1.9.5" ...
exec('phpdoc -V', $out, $ret);
echo var_dump($out); // $ret = 1, $out = array ..."Could not open input file: \phpdoc" ...
exec('dot -V', $out, $ret);
echo var_dump($out); // $ret = 1, $out = empty array
那么,我错过了什么吗?。
编辑:exec()工作正常,它适用于我的一些环境变量,如pear,cmd等,它不适用于上面指定的
phpdoc
dot(GraphViz)
即使它们在我的命令提示符下工作,并且在我的Windows环境中配置得很好。
EDIT2:
@Stefan Cvetkovic
我猜这是运行此命令时要从结果中看到的部分
shell_exec(" set"):
路径= C:\ ProgramData \甲骨文\爪哇\ javapath; C:\ Windows \ System32下; C:\视窗; C:\ Windows \ System32下\ WBEM; C:\ Windows \ System32下\ WindowsPowerShell \ V1.0 \ ; C:\ Program Files \ TortoiseHg \; C:\ Program Files(x86)\ Universal Extractor; C:\ Program Files(x86)\ Universal Extractor \ bin; C:\ xampp \ php; PATHEXT = .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC
php是否有可能无法访问我的" dot"路径,因为结果中缺少这个:
...C:\xampp\php;C:\xampp\php\pear\phpDocumentor\vendor\graphviz\bin
dot.exe位于C:\ xampp \ php \ pear \ phpDocumentor \ vendor \ graphviz \ bin,配置正确,因为我可以从命令提示符运行> dot -V
。
我也试过在没有运气的情况下改变它在PATH变量中的位置。
答案 0 :(得分:1)
我只是遇到了同样的问题。 如果有人遇到同样的问题,请确保重新启动网络服务器(我的设置中的apache),因为最近设置了PATH变量,因此在设置变量之前启动的进程(httpd)不可用。 / p>
答案 1 :(得分:0)
我会尝试在有问题的数组或变量上使用gettype
。
除此之外,我还会运行phpinfo()
以查看您的服务器中是否已启用该项目(或者我确定您已检查过的php.ini?)。
在exec exec()和shell exec http://php.net/manual/en/function.shell-exec.php上看到一些有趣的注释,其中一个项目需要管理员权限才能运行。也许它适用?
答案 2 :(得分:0)
尝试使用shell_exec()
。
在Linux平台上,例如我不能使用exec来检索lm-sensors数据,但是我可以使用shell_exec,你将得到完整的输出作为刺痛。
编辑:
试试这个:
$command = new COM("WScript.Shell");
$shellCommand = $command->Exec("C:\program.exe");
现在抓住输出。
$standard = $shellCommand->StdOut->ReadAll; # Standard output
$error = $shellCommand->StdErr->ReadAll; # Error
答案 3 :(得分:0)
虽然已经晚了两年,但我发现自己处于相同的状况并找到了解决方案:
<?php
putenv('PATH=' . $_SERVER['PATH']);
$currentBranch = exec('git rev-parse --abbrev-ref HEAD');
在exec
调用
但它确实存在于$_SERVER['PATH']
中,代码只是把它放回去并且它可以正常工作