【问题标题】:PHP write to temporary file and use it as command line argumentPHP写入临时文件并将其用作命令行参数
【发布时间】:2014-03-10 12:00:50
【问题描述】:

我正在使用 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() 方法工作吗?

【问题讨论】:

  • 至少在c#中可以将html流直接传递给wkhtmltopdf。无论如何,PHP exec() 是同步的,所以问题不存在。你能告诉我们你删除文件的代码吗?

标签: php shell command-line exec wkhtmltopdf


【解决方案1】:

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

你可以跑

locate service | grep service$ | grep php

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

PrivateTmp=true

正如您在该文件顶部的 cmets 中看到的,将文件复制到

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

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

systemctl daemon-reload
service php-fpm restart

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2018-04-18
    相关资源
    最近更新 更多