无法通过php中的shell_exec()函数运行wkhtmltopdf commad但是同样的命令在命令行上运行

时间:2015-03-12 20:59:11

标签: php wkhtmltopdf shell-exec

我遇到了麻烦,并且对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版本。 我什么都不懂......

感谢您的帮助,我正在失去理智。 大卫。

5 个答案:

答案 0 :(得分:3)

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

感谢Krzychu。

首先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

  3. 中的官方软件包

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

我已经有这个问题多年并且添加了。在' 2>&1'以某种方式解决了问题之后$command

这样:

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

而不是:

$output = shell_exec($command);

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

答案 3 :(得分:0)

是共享主机吗?好像shell_exec是一个受限制的功能。在调用shell_exec之前尝试运行error_reporting(E_ALL); ini_set('display_errors', 1);

答案 4 :(得分:0)

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