php exec()不能使用某些windows环境变量

时间:2015-03-02 15:32:22

标签: php 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

那么,我错过了什么吗?。

编辑: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变量中的位置。

4 个答案:

答案 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,你将得到完整的输出作为刺痛。

shell_exec() manual

编辑:

试试这个:

$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']中,代码只是把它放回去并且它可以正常工作