无法在PHP中使用exec()运行.exe文件

4
我希望您能够使用.exe文件进行计算,并将输出结果传递给PHP。我已经使用C++创建了一个Hello World .exe文件,但是我无法让PHP执行它。
如果我从CMD运行此命令,则会获得正确的输出:
C:\path\file.exe

但是如果我在PHP中这样做,输出结果将会是一个空字符串:

exec('C:\path\file.exe',$out);
var_dump($out);

但这将显示正确的输出:
exec('ipconfig',$out);
var_dump($out);

我是在Windows 7上使用WAMP。
编辑:这是C++程序:
#include <iostream>
using namespace std;

int main() {
    cout << "Hello World" << endl;
    return 0;
}

1
确保Web服务器对所涉及的文件具有执行访问权限。 - Orangepill
服务器是否在正确的目录中查找?尝试检查file_exists($file),如果没有,您可能需要更改目录/将文件添加到路径中。 - RyanS
@Linksku 自从您发布了悬赏以来,已经有几个回答了这个问题,但您没有对任何一个回答进行评论。难道它们都没有对您有所帮助吗? - James Holderness
@james:我一个星期没有网络连接,现在仍然只有非常有限的连接。我会尝试这些建议,如果其中一个有效,我会选择最佳答案。 - Leo Jiang
@Linksku 没关系。我只是提醒你,因为赏金期即将结束。现在不再紧急。 - James Holderness
7个回答

7

以下是几条有用的建议:

  1. 使用/代替反斜杠,它也适用于Windows。
  2. 如果您的路径中包含空格,请用双引号括起来$exec = '"C:/my path/file.exe"';
  3. 参数应该在双引号之外传递$exec = '"C:/my path/file.exe" /help';
  4. 确保您的程序实际上将内容写入到标准输出,而不是标准错误输出。

1
#4 对我来说似乎是罪魁祸首。 - Mike
我是C++的完全新手,如何确定我正在使用STDOUT还是STDERR?我在帖子结尾添加了完整的C++程序。 - Leo Jiang
它正在写入到标准输出(stdout)。 - Bruce
我怎么知道它是STDOUT还是STDEER?@dev-null-dweller - Excorpion

6

在单引号字符串中,你仍然需要转义反斜杠,所以要得到\,你需要使用\\

exec('C:\\path\\file.exe',$out);

谢谢,我忘记了这个。我已经更改了它,但它仍然是一个空字符串。 - Leo Jiang
没有错误。我刚刚尝试使用PHP打开Chrome和Photoshop,但都没有打开。 - Leo Jiang
这些是GUI应用程序。尝试使用“start …”分离地启动它们(尝试简单的一个:“start winver.exe”)。 - LSerni
2
虽然在单引号字符串中转义反斜杠是一种好的实践,但在具体的示例中实际上并不需要。 - Mike
“start winver.exe” 也不起作用。是否有 PHP 设置阻止“exec”运行 .exe 文件?我在 php.ini 中找不到类似的设置。 - Leo Jiang

3
使用return_var参数来检查命令的返回值。
$return = -1;
exec('C:\path\file.exe',$out,$return);
echo "Return value: $return\n";
var_dump($out);

在您的情况下,如果成功执行,则应返回0。如果找不到文件,则可能返回1。但如果我的怀疑是正确的,最有可能的返回值是-1073741515。
当您的应用程序缺少DLL时,会返回错误-1073741515(0xc0000135)。如果您正在使用编译器运行时库的DLL版本,就会发生这种情况。
当在本地运行时,您已经安装了DLL,应用程序可能正常工作,但在从Web服务器运行时仍可能失败,因为Web服务器不一定具备所需的DLL。
如果这是问题,您需要重新编译应用程序以使用静态库,或在Web服务器上安装必要的DLL。您没有说明您使用的编译器,但有关Visual C++使用的DLL的更多信息,请参见here

当我在php中运行exec时,出现了-1073741515(0xc0000135)的错误。我的c++程序非常简单,只是打印hello world。我使用g++在Windows 7上编译它,并且可以在cmd中调用。在这种情况下,我需要哪个dll文件? - 风间月

2
请检查您的config/php.ini文件,exec函数可能已被禁用在disable_functions中,或者检查 open_basedir 行,PHP可能受到访问某些目录的限制。

1
我已经复制了你的代码进行测试,并且:
第一次没有输出。
我添加了file_exists测试并得到:
Warning: file_exists(): open_basedir restriction in effect. 
File(xxxxxxxxx) is not within the allowed path(s): (xxxxx:xxxx:xxxx:xxxx:xxx:xxx:) 
in xxxxxx/test.php on line 4 
Call Stack: 0.0004 645640 1. {main}() xxxx/test.php:0 0.0004 646016 2. 
file_exists() xxxxxx/test.php:4

我将file.exe移动到test.php所在的同一目录,并获得以下结果:
array(1) { [0]=> string(11) "Hello World" }

PHP:

<?php
$file = 'xxxxx/file.exe';
if (!file_exists($file)) echo 'File does not exists';
exec($file, $out);
var_dump($out);
?>

1
这应该可以工作:

exec('"C:\\folder name with space\\program.exe" argument1 "argument2 with space"', $output, $return);
var_dump($output); //"Hello World"
var_dump($return); //0

0

我曾经遇到过同样的问题。你可以创建一个test.bat文件,并在其中输入(fwrite())命令。然后执行(exec('test.bat', $out, $ret))该批处理文件。

test.bat包含:

C:\path\file.exe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接