我想用exec()从PHP运行几个命令,它似乎只适用于我的Windows环境variables中定义的一些命令,但不是所有的。
在我的命令提示符下,我可以从任何path(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
所有这些都为每个指定的程序返回正确的版本,这意味着环境variablesconfiguration得很好。
但在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()工作正常,它适用于我的一些环境variables,如pear,cmd等,它不适用于上面指定的
PHPDoc的
点(GraphViz)
即使他们在我的命令提示符下工作,并在我的Windows环境中configuration良好。
EDIT2:
@Stefan Cvetkovic我觉得这是你想从运行这个命令的结果中看到的部分
了shell_exec( “设置”):
path= C:\ ProgramData \ ORACLE \的Java \ javapath; C:\ WINDOWS \ SYSTEM32; C:\ WINDOWS; 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无法访问我的“点”path,因为这是从结果中缺less:
...C:\xampp\php;C:\xampp\php\pear\phpDocumentor\vendor\graphviz\bin
dot.exe位于C:\ xampp \ php \ pear \ phpDocumentor \ vendor \ graphviz \ bin中,并且configuration良好,因为我可以在命令提示符下运行> dot -V
。 我也尝试改变它在PATHvariables中的位置,但没有运气。
我只是有同样的问题。 如果有人遇到同样的问题,请确保重新启动web服务器(我的设置中的apache),因为最近设置了PATH变量,因此在设置变量之前启动的进程(httpd)不可用。
我会尝试使用gettype
的数组或有问题的变数。
除此之外,我还会运行phpinfo()
来查看服务器中是否启用了该项(或者我确定已经检查过了php.ini)。
在exec exec()和shell exec http://php.net/manual/en/function.shell-exec.php上看到了一些有趣的注释,其中一个项目需要管理员权限才能运行。 也许它适用?
尝试使用shell_exec()
。
在Linux平台上,例如我不能使用exec来检索lm-sensors数据,但是使用shell_exec我可以,而且你会得到完整的输出。
shell_exec()手册
编辑:
尝试这个:
$command = new COM("WScript.Shell"); $shellCommand = $command->Exec("C:\program.exe");
现在抓住输出。
$standard = $shellCommand->StdOut->ReadAll; # Standard output $error = $shellCommand->StdErr->ReadAll; # Error
虽然晚了两年,但我发现自己处于同样的状况,并找到了解决办法:
<?php putenv('PATH=' . $_SERVER['PATH']); $currentBranch = exec('git rev-parse --abbrev-ref HEAD');
在exec
调用中,由于未知原因,环境变量缺失,
但它确实存在于$_SERVER['PATH']
,代码只是把它放回来,它的工作原理