【问题标题】:Run an external program with php使用 php 运行外部程序
【发布时间】:2011-07-24 08:08:29
【问题描述】:

我的 php 有问题!我想用 php 运行一个外部程序。这个程序在命令行和 linux 平台上工作。所以它必须工作得很好。但我尝试了更多时间,但我无法运行它。那怎么了! 这是程序的链接:http://www.lalescu.ro/liviu/fet/ 这是在命令行中正常工作的命令,而不是在 php 中的情况:

./fet --inputfile=Hopwood.fet --outputdir=out

这是 php 代码:

<?php
`./fet --inputfile=Hopwood.fet --outputdir=out`
?>

我希望解决这个问题。 提前谢谢..

更新我上传了可执行程序和Hopwood.fet文件给你试试.. 这是一个链接: http://rapidshare.com/files/454756427/fet.tar.gz

【问题讨论】:

  • 如果您格式化您的代码,这可能会对我们有所帮助,以便我们可以准确地看到您尝试运行的内容。
  • 您确定在正确的子目录中运行 ./fet 吗?
  • 好吧,我现在去编辑我的问题。
  • 正如@stillstanding 所说。因此,您可能想尝试使用二进制文件的绝对路径。例如。 /usr/bin/local/fet --inputfile=Hopwood.fet --outputdir=out 其中/usr/bin/local 是包含fet 的目录
  • @treffynnon 我尝试但没办法!

标签: php linux command exec


【解决方案1】:

尝试使用完整路径:

/path/to/installed/fet --inputfile=/path/to/your/Hopwood.fet --outputdir=/path/to/your/out

所以你最终会执行:

exec("/path/to/installed/fet --inputfile=/path/to/your/Hopwood.fet --outputdir=/path/to/your/out");

另外,请确保正在运行的进程能够写入您的/path/to/your/out

更新

为了让事情更清楚,请尝试运行以下命令:

exec("/path/to/installed/fet --inputfile=/path/to/your/Hopwood.fet --outputdir=/path/to/your/out 2> /tmp/fet.error.log", $output, $status);

echo "status: " . $status;
echo "output: " . implode("\n", $output);

if(file_exists("/tmp/fet.error.log"))
{
  echo "Error Log: " . file_get_contents("/tmp/fet.error.log");
}

更新

正如@mkotwd 在另一个答案中所说(在上面尝试调试代码之后)。问题是因为fet 试图访问 X 服务器。因此,作为@mkotwd 的答案,解决方案是添加:

export DISPLAY=:0

命令变成:

exec("export DISPLAY=:0 && fet --inputfile=Hopwood.fet --outputdir=out");

【讨论】:

  • 不幸的是,我设置了正确的权限和整个路径但不起作用!
  • 如果权限正确(您需要在程序和输入/输出目录上执行,并在“fet”及其所​​需的任何资源上执行读取+执行权限)并且您已检查网络服务器没有运行 chroot 并且您没有禁用执行功能,那么它将起作用。回去再试一次。
  • @symcbean 谢谢,如果你可以试试这个程序,我在下面设置链接
  • 不错:这是输出:状态:1输出:错误日志:fet:无法连接到 X 服务器
  • 哈哈!就像我一样。这个问题告诉我们您的应用程序需要 X 服务器,而这通常在托管服务器上不可用:en.wikipedia.org/wiki/X_Window_System。很抱歉,如果是问题所在,我不能再帮你了。
【解决方案2】:

看起来您正在从本地安装运行 fet(基于您发布的 ./fet 命令)。

您需要将您的 fet 安装位置添加到您的 PATH 变量中。

在 linux 系统上,编辑您的 ~/.bashrc,并添加以下内容:

export PATH=$PATH:/home/mkotwd/fet

如果 /home/mkotwd/fet 是您安装 fet 的位置。

或者,您也可以创建一个目录 ~/bin,如上所述将其添加到您的 PATH 中,然后创建一个指向您的 fet 可执行文件的符号链接 ~/bin/fet。这是推荐的解决方案,因为您不必将将来可能要运行的每个本地命令的目录添加到 PATH,您只需为 ~/bin 中的每个可执行文件创建符号链接

您可能还想查看http://php.net/manual/en/function.exec.php,了解使用该命令执行各种任务的用户发布的通话详细信息、安全注意事项和其他提示。

【讨论】:

  • 是的,我尝试了所有这些但不起作用,如果完成,exec 命令返回 0 int,fyi 函数返回 1 值!!
【解决方案3】:

检查php -i | less 以获得:

这可能是其中一种安全措施,可以阻止那些关键命令(或两者)。

【讨论】:

  • exec 命令适用于我尝试的其他程序,例如使用 inkscape 和 mkdir 命令调整大小,ls .. 安全模式已关闭!!
【解决方案4】:

解决办法是在前面加上这个命令:

export DISPLAY=:0

所以代码变成了:

<?php
exec("export DISPLAY=:0 && fet --inputfile=Hopwood.fet --outputdir=out");
?>

【讨论】:

  • 你可能已经提到过,fet 默认会尝试启动一个窗口。
  • @Amey,你应该阅读整个评论和问题和答案;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2011-11-03
  • 2012-12-30
  • 2016-08-14
相关资源
最近更新 更多