php exec()不能与一些windows环境variables一起工作

我想用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'] ,代码只是把它放回来,它的工作原理