php shell_exec命令不像bash /返回错误

时间:2012-04-25 10:21:44

标签: php bash pdf pdf-generation wkhtmltopdf

这是我的代码:

$url = escapeshellarg("http://www.mysite.com");
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300  --page-size A4 $url /srv/www/mysite/public_html/tmp_pdf.pdf");
$str = file_get_contents("/srv/www/mysite/public_html/tmp_pdf.pdf");
header('Content-Type: application/pdf');
header('Content-Length: '.strlen($str));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');
die($str);

在我的bash shell中(使用Debian)命令

  

shell_exec(“xvfb-run -a -s'-screen 0 640x480x16'wkhtmltopdf --dpi   300 - 页面大小A4 html://www.mysite.com /srv/www/mysite/public_html/tmp_pdf.pdf

工作,它在所需的位置生成一个pdf,但当我在php中执行命令时,没有任何东西被创建,我将返回到一个空的pdf文件(因为它不存在)。 有人能帮我弄清楚出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

问题是Apache服务器没有对我试图编写pdf的文件夹的写访问权(在我的例子中是/ srv / www / mysite / public_html /)。

所以我只是将文件夹位置更改为/ tmp(每个人都有写入权限),现在它可以正常工作。更正的代码是:

$url = escapeshellarg("http://www.mysite.com");
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300  --page-size A4 $url /tmp/tmp_pdf.pdf");
$str = file_get_contents("/tmp/tmp_pdf.pdf");
header('Content-Type: application/pdf');
header('Content-Length: '.strlen($str));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');
die($str);

答案 1 :(得分:0)

我不知道你的工具在那里,所以用一公吨的盐就可以了。

如果您有网址并且该工具会自行下载网址,则可能会阻止某些网络权限。如果你可以自己下载网址,只需给这个工具提供可能消除这种可能性的内容(或来自临时文件)。

同时检查您尝试写入的文件夹的权限。

既然你说Debian,请执行以下命令:

which xvfb-run

这将为您提供可执行文件的完整路径,我将在shell_exec的调用中使用它。

至于流式传输文件,我会使用readfile。

$filePath = "/srv/www/mysite/public_html/tmp_pdf.pdf";

header('Content-Type: application/pdf');
header('Content-Length: ' . filesize($filePath));
header('Content-Disposition: inline; filename="pdf.pdf"');
header('Cache-Control: private, max-age=0, must-revalidate');
header('Pragma: public');
ini_set('zlib.output_compression','0');

readfile($filePath);
exit();

优点是整个文件不需要为此读入内存。