php-exec()无法处理某些windows环境变量


php exec() not working with SOME of the windows environment variables

我正试图用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

那么,我是不是错过了什么?。

EDIT:exec()运行良好,它适用于我的一些环境变量,如pear、cmd等,但不适用于上面指定的

phpdoc
点(GraphViz)

尽管它们在我的命令提示符下工作,并且在我的windows环境中配置良好。

第2版:
@Stefan Cvetkovic我想这是你想在运行命令时从结果中看到的部分

shell_exec("set"):

路径=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: ''axamp''php;PATHEXT=.COM;。EXE;。蝙蝠;。CMD;。VBS;。VBE;。JS;。JSE;。WSF;。WSH;。MSC-

php是否可能无法访问我的"点"路径,因为结果中缺少以下内容:

...C:'xampp'php;C:'xampp'php'pear'phpDocumentor'vendor'graphviz'bin

dot.exe位于C:''examplep''php''pear''phpDocumentor''vendor''graphviz''bin中,它的配置很好,因为我可以在命令提示符下运行> dot -V。我还尝试过更改它在PATH变量中的位置,但没有成功。

我刚刚遇到了同样的问题。如果有人遇到同样的问题,请确保重新启动Web服务器(在我的设置中是apache),因为PATH变量是最近设置的,因此在设置变量之前启动的进程(httpd)不可用。

虽然晚了两年,但我发现自己也处于同样的情况,并找到了解决方案:

<?php
putenv('PATH=' . $_SERVER['PATH']);
$currentBranch = exec('git rev-parse --abbrev-ref HEAD');

由于未知原因,exec调用中缺少环境变量,

但它确实存在于$_SERVER['PATH']中,代码只是把它放回原处,它就可以在

中工作

我会尝试在有问题的数组或变量上使用gettype

除此之外,我还将运行phpinfo(),看看该项目是否在您的服务器中启用(或者php.ini,我确信您选中了它?)。

看到了一些关于exec-exec()和shell exec的有趣注释http://php.net/manual/en/function.shell-exec.php,其中项目需要管理员权限才能运行。也许它适用?

尝试使用shell_exec()

例如,在linux平台上,我不能使用exec来检索lm传感器数据,但使用shell_exec我可以,您将获得作为sting的完整输出。

shell_exec()手动

编辑:

试试这个:

$command = new COM("WScript.Shell");
$shellCommand = $command->Exec("C:'program.exe");

现在获取输出。

$standard = $shellCommand->StdOut->ReadAll;    # Standard output
$error = $shellCommand->StdErr->ReadAll;       # Error