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

时间:2013-07-03 21:43:09

标签: php c++ exe

我尝试使用.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;
}

7 个答案:

答案 0 :(得分:7)

可能有所帮助的建议很少:

  1. 使用/代替,它也适用于Windows。
  2. 如果您的路径包含空格,请用双引号$exec = '"C:/my path/file.exe"';
  3. 换行
  4. 参数应在双引号$exec = '"C:/my path/file.exe" /help';
  5. 之外传递
  6. 确保您的程序实际写入STDOUT,而不是STDERR。

答案 1 :(得分:5)

在单引号字符串中,您仍需要转义反斜杠,以便\获得\\

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

答案 2 :(得分:2)

检查你的config / php.ini文件,exec函数可以在 disable_functions 下删除或检查行 open_basedir ,PHP可以限制访问某些目录

答案 3 :(得分:2)

使用 return_var 参数检查命令的返回值。

$return = -1;
exec('C:\path\file.exe',$out,$return);
echo "Return value: $return\n";
var_dump($out);

在你的情况下,如果它被成功执行,它应该返回0.如果找不到文件,它可能会返回1.如果我的怀疑是正确的,我认为最可能的返回值是-1073741515。 / p>

错误-1073741515(0xc0000135)是应用程序缺少DLL时返回的内容。如果您使用编译器的运行时库的DLL版本,则会发生这种情况。

当您在本地运行时,应用程序可能正常运行,您可以在其中安装DLL,但在从Web服务器运行时可能仍然会失败,这不一定会有。

如果这是问题,您需要重新编译应用程序以使用静态库,或者在Web服务器上安装必要的DLL。您没有说明您使用的是哪种编译器,但有关Visual C ++使用的DLL的更多信息,请参阅here

答案 4 :(得分: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);
?>

答案 5 :(得分:1)

这应该有效:

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

答案 6 :(得分:0)

我有同样的问题。您可以创建test.bat文件并在其中输入(fwrite())命令。然后执行(exec('test.bat', $out, $ret))该bat文件。

test.bat包含:

C:\path\file.exe