PHP写入临时文件并将其用作命令行参数

时间:2014-02-12 09:08:32

标签: php shell command-line exec wkhtmltopdf

我正在使用wkhtmltopdf自动生成pdf文件。我有两种类型的输入,url和html。 url类型很好,因为我只是通过命令传递url。但是你不能直接将html传递给wkhtmltopdf。

我试图做的是:

$tmp = tmpfile();
$data = stream_get_meta_data($tmp);
$file = $data['uri'];
fwrite($tmp, $html);

exec(sprintf('wkhtmltopdf %s %s', $file, 'data.pdf'));

这不起作用,因为临时文件在命令执行之前被删除(或者至少是我认为发生的事情。)我能想到的唯一工作就是在同一目录中创建我自己的临时文件,使用它然后在生成后删除它。有什么办法可以让tmpfile()方法起作用吗?

1 个答案:

答案 0 :(得分:0)

在linux上使用php-fpm和 systemd 时,我遇到了同样的问题。 问题是systemd将每个进程的tmp文件夹映射到某个私有空间,而其他进程无法访问它。

你可以运行

locate service | grep service$ | grep php

检查负责配置文件的位置。 对我来说这是/usr/lib/systemd/system/php-fpm.service。 在[服务]部分下的此文件中,您将找到选项

PrivateTmp=true

正如您可以阅读该文件顶部的评论一样,将文件复制到

似乎是最佳做法
/etc/systemd/system/php-fpm.service

并在那里进行更改,以便在包更新时不会覆盖它们。 设置PrivateTmp = false后,必须重新加载守护进程,并可能使用以下命令重新启动php-fpm:

systemctl daemon-reload
service php-fpm restart

我希望这可以解决你的问题。