【问题标题】:Run C++ executable on PHP在 PHP 上运行 C++ 可执行文件
【发布时间】:2012-12-06 17:28:12
【问题描述】:

我想编写 PHP 脚本,在 Linux 机器上执行 C++ 可执行文件。我使用 exec() 或 system() PHP 函数。但它不执行 C++ 可执行文件。 我的代码如下。 Proc 是编译后的 C++ 可执行文件。完全相同的命令在 shell 中也能正常工作。

echo system('/var/www/image_proc/proc "/var/www/image_proc/images/original/5_1.png" 70 0 0 "/var/www/image_proc/images/processed/5_2.png"');

我检查了执行和写入文件的所有权限。而且我使用绝对路径来确保这不是路径问题。

有谁知道,可能是什么问题? 任何帮助表示赞赏。

【问题讨论】:

  • 您看到错误了吗?还是您只是看不到您期望的输出?
  • 以下操作有效吗? 如果没有,它会显示什么吗?
  • 是否有一些标志,我必须在 php.ini 中添加才能执行 C++ 脚本?
  • 如果您使用的是 PHP safe mode。如果是,您需要将/var/www/image_proc 添加到sage-mode-exec-dir
  • 因为 ls 工作...您确定运行 apache 的用户具有执行权限吗?我知道你说你检查过,只是说要仔细检查:)

标签: php c++ linux executable


【解决方案1】:

我怀疑问题在于引号的使用。 SHELL 可能会扩展/评估这些,但不会调用 system()。 libc system

因此建议的解决方案是:

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    $src = "/var/www/image_proc/images/original/5_1.png";
    $dst = "/var/www/image_proc/images/processed/5_2.png";
    $cmd = sprintf("/var/www/image_proc/proc %s 70 0 0 %s", $src, $dst);
    $result = system($cmd, $retval);
    printf("Result: '%s'\n\nReturn value: %d\n\n", $result, $retval);
?>

这将输出命令的结果或有用的错误信息。尤其重要的是,这给了我们一个返回值,我们可以根据它找出发生了什么。

【讨论】:

  • 感谢您的回答。这个我也试过了,还是一样的问题,返回码是127,表示system()找不到可执行文件,但是路径是正确的,命令在shell中运行正常。
  • @Karmar 这意味着路径无效。更准确地说,PHP 看不到该路径。 Apache 可能在 chroot 或其他安全环境中运行,这会阻止它读取 /var/www/image_proc 或(不太可能的原因)添加参数会导致您的命令失败。我建议从这里获取并运行 chdir("/var/www/image_proc"); foreach (glob(".") as $filename) { echo $filename . "
    \n";是否输出 /var/www/image_proc 中的所有文件?如果没有,那就是 chroot / 安全案例。 // glob 必须包含星点星 (.)。由于某种原因,它没有正确显示。
  • @Kamar 回答完这个问题后,我应该可以告诉你如何让它发挥作用。
  • 谢谢马雷克。我发现了一个问题。从浏览器运行 C++ 可执行文件时(通过在命令文件中执行“php phpfilename”,它可以工作),它找不到 C++ 文件所需的共享库。原因是,我为共享库设置的环境变量没有为 apache 用户设置。我通过 putenv 函数在 php 中设置它,这解决了我的问题。
  • @Kamar 太好了,我很高兴它有效。我可以至少竖起大拇指吗? (一票):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2015-08-21
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多