PHP:获取真实 /tmp 路径的方法?

Osa*_*bie 5 php temporary-files systemd centos7

我正在将我的 Web 应用程序从 CentOS 5 迁移到 CentOS 7,有关 /tmp 目录的新安全功能正在破坏我的代码。我想知道如何最好地处理它。

我有 PHP 代码,它创建一个 LaTeX 文件,然后执行命令将其转换为 PDF,然后使用适当的标题将其提供给用户。以下是目前的一些相关代码行:

$fileroot = "/tmp/addr".getmypid();
ob_start();
/* echo all the LaTeX stuff */
file_put_contents($fileroot.".tex",ob_get_contents());
ob_end_clean();
exec("cd /tmp;uplatex -interaction=batchmode --output-directory=/tmp $fileroot", $output, $return);
Run Code Online (Sandbox Code Playgroud)

/usr/lib/systemd/system/php-fpm.service 中的设置包含PrivateTmp=true,这会导致/tmpPHP 函数调用实际上是/tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp。哎呀!这对于安全性来说很好,但是 exec() 按/tmp字面意思使用路径,因此它无法找到刚刚创建的文件file_put_contents()。PHP 函数sys_get_temp_dir()只是返回/tmp,并且我找不到任何包含该路径的环境变量。有没有办法以编程方式获取该路径?或者我需要关闭 PrivateTmp 吗?或者有更好的方法来做我需要做的事情吗?是的,我可以创建自己的具有广泛开放权限的特殊位置,但似乎只使用正常的临时目录应该更干净。

Ale*_*s G 4

在我看来,只有两个选择:

  1. 不要使用/tmp您在应用程序的配置文件中预定义的不同目录。我最近做了类似的事情,我使用/var/run/myapplication目录而不是/tmp. (我还必须添加一个 cron 作业来清理它。)

  2. PrivateTmp在 php-frm 服务中禁用。这是执行此操作的一种方法:

    # mkdir  /usr/lib/systemd/system/php-fpm.service.d
    # echo -e "[Service]\nPrivateTmp=no" > /etc/systemd/system/php-fpm.service.d/privatetmp.conf
    # systemctl daemon-reload
    # systemctl restart php-fpm
    
    # systemctl show php-fpm | grep PrivateTmp
    PrivateTmp=no
    
    Run Code Online (Sandbox Code Playgroud)

  • 对您的答案进行一个小修正:我认为应该是“PrivateTmp=false”,而不是“no”。 (3认同)