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