【问题标题】:Can't run .exe files using exec() in PHP无法在 PHP 中使用 exec() 运行 .exe 文件
【发布时间】:2013-07-03 21:43:08
【问题描述】:

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

【问题讨论】:

  • 确保网络服务器对相关文件具有执行权限。
  • 服务器是否在正确的目录中查找?尝试检查file_exists($file),如果不是,您可能需要更改目录/将文件添加到您的路径
  • @Linksku 自从你发布赏金以来,这个问题已经有好几个答案了,你还没有对其中任何一个发表评论。他们都没有对你有任何帮助吗?
  • @james:我已经有一周没有互联网连接了,我目前的连接仍然非常有限。如果其中一个可行,我将尝试这些建议并选择最佳答案。
  • @Linksku 没关系。我只是在提示你,因为赏金期即将结束。已经不紧急了。

标签: php c++ exe


【解决方案1】:

一些可能有帮助的建议:

  1. 改用/,它也可以在windows下工作。
  2. 如果你的路径包含空格,用双引号括起来$exec = '"C:/my path/file.exe"';
  3. 参数应该在双引号$exec = '"C:/my path/file.exe" /help';之外传递
  4. 确保您的程序实际写入的是 STDOUT,而不是 STDERR。

【讨论】:

  • #4 听起来像是我的罪魁祸首。
  • 我完全是 C++ 初学者,如何判断我使用的是 STDOUT 还是 STDERR?我在文章末尾添加了完整的 C++ 程序。
  • 它正在写入标准输出(cout)
  • dp 我如何知道它的 STDOUT 还是 STDEER ? @dev-null-dweller
【解决方案2】:

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

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

【讨论】:

  • 谢谢,我忘记了。我改了,还是空字符串。
  • 没有错误。我刚刚尝试使用 PHP 打开 Chrome 和 Photoshop,都没有打开。
  • 这些是 GUI 应用程序。尝试用“start ...”启动它们(尝试一个简单的:“start winver.exe”)。
  • 虽然在单引号字符串中转义反斜杠肯定是一种好习惯,但在具体示例中实际上并不需要。
  • "start winver.exe" 也不起作用。是否存在阻止“exec”运行 .exe 文件的 PHP 设置?我在 php.ini 中找不到类似的东西
【解决方案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 服务器上安装必要的 DLL。您没有说明您使用的是什么编译器,但有关 Visual C++ 使用的 DLL 的更多信息,请参阅here

【讨论】:

  • 我在php中运行exec时得到-1073741515 (0xc0000135),我的c++程序很简单,只打印hello world,我在windows 7上使用g++编译它可以在cmd中调用.在这种情况下我需要什么 dll?
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我已经复制了你的代码来测试它并且:

    第一次没输出。

    我添加了 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);
    ?>
    

    【讨论】:

      【解决方案6】:

      这应该可行:

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

      【讨论】:

        【解决方案7】:

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

        test.bat 包含:

        C:\path\file.exe
        

        【讨论】:

          猜你喜欢
          • 2014-12-30
          • 1970-01-01
          • 2020-05-07
          • 2019-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          相关资源
          最近更新 更多