PHP和Apache:shell_exec(带有xvfb的wkhtmltopdf)命令不起作用

时间:2012-09-18 18:12:34

标签: php apache wkhtmltopdf shell-exec xvfb

我尝试在apache(2.4.2)上使用php(5.4.2)运行wkhtmltopdf(0.11.0 rc1)。 当我尝试启动wkhtmltopdf-i386 --use-xserver http://www.google.com google.pdf 2>&1时,我可以找到我的pdf。这是我的PHP代码

<?php
    $cmd= '/usr/bin/wkhtmltopdf-i386 http://www.google.com google.pdf 2>&1';
    $ret = shell_exec($cmd);
    echo $ret;
?>

它适用于apache和命令行php test.php。 因为我的目标页面包含许多图像和一些“重”js图表。当我尝试将其转换为pdf时,我的wkhtmltopdf命令出现了Segmentation Fault。 使其工作的唯一方法是使用xvfb作为X11仿真器。代码如下所示:

<?php
    $cmd= '/usr/bin/xvfb-run  /usr/bin/wkhtmltopdf-i386 --use-xserver http://www.google.com google.pdf 2>&1';
    $ret = shell_exec($cmd);
    echo $ret;
?>

此脚本适用于命令行php test.php,但它不适用于apache。如果我使用htop查看apache的进程,我可以看到有两个进程(使用php test.php):

  • xvfb的
  • wkhtmltopdf

当我使用apache启动时,我只有xvfb进程。它完成了apache的超时,因为它正在等待wkhtmltopdf进程。

我可以使用apache(2.2.21)和php(5.3.10)。

有什么东西我不见了吗?也许在apache的config-files中有什么东西?

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。我使用的是exec函数,但同样适用于shell_exec。在php.ini中禁用了函数执行。

SOLUTION:从php.ini文件中的disable_functions中删除shell_exec字符串。

答案 1 :(得分:0)

我不确定为什么你的第二个版本不能从Apache调用(不能使用相同的shell,因为shell_exec使用shell?),但作为一个解决方法你可以(来自Apache PHP) shell_exec("php test.php");并获得您的预期结果?

也许还尝试其他流程执行功能之一,例如pcntl_exec

答案 2 :(得分:0)

主要是因为所有权和权限,请尝试

su www-data (for debian)
php test.php

你可能会看到错误。