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;
}
4

7 回答 7

7

一些可能有帮助的建议:

  1. 改用/它,它也可以在 Windows 下工作。
  2. 如果您的路径包含空格,请将其用双引号引起来$exec = '"C:/my path/file.exe"';
  3. 参数应该在双引号之外传递$exec = '"C:/my path/file.exe" /help';
  4. 确保您的程序实际写入 STDOUT,而不是 STDERR。
于 2013-07-03T21:58:01.273 回答
6

在单引号字符串中,您仍然需要转义反斜杠,因此\需要\\

exec('C:\\path\\file.exe',$out);
于 2013-07-03T21:47:24.780 回答
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。您没有说您使用的是什么编译器,但有关 Visual C++ 使用的 DLL 的更多信息,请参见此处

于 2013-07-17T13:27:55.363 回答
2

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

于 2013-07-15T09:08:00.133 回答
1

这应该有效:

exec('"C:\\folder name with space\\program.exe" argument1 "argument2 with space"', $output, $return);
var_dump($output); //"Hello World"
var_dump($return); //0
于 2013-07-18T13:00:42.170 回答
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);
?>
于 2013-07-18T07:38:58.320 回答
0

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

test.bat包含:

C:\path\file.exe
于 2013-07-18T06:36:10.280 回答