【问题标题】:Executing a linux program from php从 php 执行 linux 程序
【发布时间】:2017-08-15 12:11:21
【问题描述】:

使用以下软件:http://silvercoders.com/en/products/doctotext/

我使用以下代码让它在我的 Window 机器上工作:

<?php    

$file = 'C:\xampp\htdocs\SMF\sdsdssss.docx';

$content = exec( 'C:\xampp\htdocs\SMF\doctotext\doctotext.exe /c '. $file , $output );

var_dump( $output );

但是,当我在我的 Centos 机器上尝试使用 linux x86_64 版本的软件时,我无法让它工作。 (是的,我的机器也是x86_64)

我试过了:

<?php

$file = '/home/***/public_html/downloads/test_doc.docx';

$content = shell_exec( '/home/***/public_html/doctotext/doctotext.sh \c '. $file , $output );

但没有任何输出。运行 centos 的等效执行格式是什么。

请指教

【问题讨论】:

  • 你检查过你在linux机器上安装了php吗?您可以通过从终端运行 php -v 来做到这一点。
  • 我昨天发现windows的doctotext和linux的版本不一样。当您在 Windows 上运行 .exe 时,它​​包含所有附属文件,但 linux 包并非如此。因此,我需要知道如何实际安装该死的程序,因为当我尝试通过命令行运行它时,它一直告诉我文件丢失了。我现在的问题是:如何在我的 Linux 机器上安装它,如果安装得当,运行它所需的所有文件都包括在内:github.com/karlproject/doctotext
  • 那么你应该开始一个新问题,因为上下文完全不同。

标签: php linux shell centos


【解决方案1】:

首先shell_exec() 不接受第二个参数。我认为您将该函数与 exec() 混淆了,它确实需要多个参数:

exec('/home/***/public_html/doctotext/doctotext.sh \c '. $file, $output, $return);

来自shell_exec()的文档:

当发生错误或程序没有输出时,此函数可以返回 NULL。使用此功能无法检测执行失败。当需要访问程序退出代码时,应使用 exec()。

其次,我认为您首先应该检查 shell 脚本是否具有执行权限。您可以使用以下方法设置正确的权限:

chmod +x /home/***/public_html/doctotext/doctotext.sh

根据脚本的用途,您可能还需要以 root 权限运行它:

sudo php -f myscript.php

如果您通过浏览器运行脚本,您还应确保 Web 服务器可以读取 shell 脚本的路径。

如果您启用错误报告并检查您在运行脚本时是否收到任何错误消息,那也很好。

【讨论】:

  • 我尝试了以下但仍然没有输出: $content = exec('/home/***/public_html/doctotext/doctotext.sh \c '. $file, $output, $return );
  • 您是否在您的 php 文件中启用了错误报告?你把变量$content$output$return 转储了吗?您是否已验证该文件确实存在于指定位置并具有正确的权限?
  • 这就是我所做的: var_dump( $content ): I GOT string(0) "" var_dump( $output ): I GOT array(0) { } var_dump( $return ): I GOT int (126) var_dump( $string ): 我得到了 string(0) ""
  • 道歉:文件存在,权限已设置为777;此外,包含代码的脚本也位于 777。我对服务器具有 root 访问权限,因为它是专用服务器。将支付高价让这个工作。请指教:(
  • @stylusss - 你是如何从终端或浏览器运行你的 php 文件的?如果您使用的是后者,请尝试使用sudo php -f &lt;script.php&gt; 从终端运行文件,看看是否可行。就像我之前所说的,通过将ini_set('display_errors', 1); error_reporting(E_ALL); 放在脚本顶部来启用错误报告。您希望从命令行运行脚本的原因是,如果您通过浏览器运行它,网络服务器而不是您将执行脚本。
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多