【问题标题】:Not able to run wkhtmltopdf commad through shell_exec() function in php but same command works on command line无法通过 php 中的 shell_exec() 函数运行 wkhtmltopdf commad,但相同的命令在命令行上有效
【发布时间】:2015-05-15 05:13:31
【问题描述】:

我遇到了麻烦,并且对 php shell_exec 命令感到非常困惑。 当命令由 PHP 执行时,我没有错误,但执行失败。如果我完全从终端使用相同的命令,它就可以工作。

命令如下:

/usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyxa9otq.html" "/tmp/knplabs_snappyv3pD7h.pdf"

当我从终端启动时:

$ /usr/bin/wkhtmltopdf --lowquality --dpi 300 --encoding utf-8 "/tmp/knplabs_snappyWG9XTd.html" "/tmp/knplabs_snappyv3pD7h.pdf"
Loading page (1/2)
Printing pages (2/2)                                               
Done      

但是从我的 php 脚本中:

// Construct the previous command
$command = $this->buildCommand($url, $path);
../..
shell_exec($command);
../..
$content = file_get_contents($path);
../..

我已经测试了 shell_exec 的输出,它是空的。

日志:

Warning: file_get_contents(/tmp/knplabs_snappyv3pD7h.pdf): failed to open stream: No such file or directory in /*****/lib/snappy/SnappyMedia.class.php on line 64

在/tmp目录下没有pb权限:

$ ls -la /tmp
total 448
drwxrwxrwt 16 root  root    4096 mars  12 21:51 .
../..

我已经尝试使用 PHP exec() 函数来获取错误信息,我只是在 return_var 中得到一个“1”错误代码,而输出中没有任何内容。

有关信息,此问题出现在我的测试服务器、我的台式计算机上,但没有出现在我的笔记本上。所有 3 都具有相同的 PHP、Apache、Mysql 版本。 我什么都不懂……

感谢您的帮助,我疯了。 大卫。

【问题讨论】:

    标签: php wkhtmltopdf shell-exec


    【解决方案1】:

    我在这里找到了解决方案:Executing wkhtmltopdf from PHP fails

    感谢克日丘。

    首先要从shell_exec 命令获取信息,在命令末尾添加“2>&1”。这样,您将获得返回命令的信息:

    $no_output = shell_exec($command);
    echo $no_output; // nothing
    
    $output = shell_exec($command . ' 2>&1');
    echo $output; // in my case : "cannot connect to X server"
    

    解决办法:

    1. 不使用 wkhtmltopdf ubuntu 包 (0.9.9-4)

    2. 使用来自Wkhtmltopdf download page的官方包

    所以不需要安装 xvfb !(这个建议我看过很多次了)

    【讨论】:

      【解决方案2】:

      看起来像是用户的权限问题。

      当您从终端运行命令时,它是当前使用的具有正确权限的用户帐户,可以在 /usr/bin 中运行命令并执行特定文件。

      当你从 php 脚本运行它时,它是你系统上的 http 服务器帐户,它需要执行 /usr/bin 中文件的权限。通常这是 apache 用户。

      您应该如何设置权限取决于您的系统。请记住,对于 apache 允许的内容,对访问您的 http 服务器的任何人都是允许的。

      【讨论】:

      • 不,不是,apache 服务器使用“david”uid(不是 www-data)运行。
      【解决方案3】:

      我已经有这个问题很长时间了,并且添加了 . ' 2>&1'$command 以某种方式解决了问题之后。

      这个:

      $output = shell_exec($command . ' 2>&1');
      

      代替:

      $output = shell_exec($command);
      

      不知道为什么,但它有效,我很感激。

      【讨论】:

        【解决方案4】:

        它是共享主机吗?似乎 shell_exec 是一个受限制的函数。在调用 shell_exec 之前尝试运行 error_reporting(E_ALL); ini_set('display_errors', 1);

        【讨论】:

        • 这个tric不改变点。我已经成功地在执行命令的末尾收到了带有 2>&1 的错误消息:$output = shell_exec($commande. " 2>&1"); echo $output; 我得到“无法连接到 X 服务器”。
        • 很高兴您找到了解决方案。我在想您不允许使用该功能,错误报告会打开“投诉模式”,因此您会看到如下内容:shell_exec() has been disabled for security reasons on line 1
        【解决方案5】:

        我偶然发现了同样的问题,在我的情况下,像 /var/www 这样的 exec 命令中的绝对路径不起作用,我必须从执行 php 文件的位置开始使用相对路径。

        我还想注意,它不能使用 shell_exec 工作,但是它可以使用普通的 exec 命令工作,不知道这里的区别在哪里。

        【讨论】:

          猜你喜欢
          • 2014-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-26
          • 2014-12-02
          相关资源
          最近更新 更多