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
,这会导致/tmp
PHP 函数调用实际上是/tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp
。哎呀!这对于安全性来说很好,但是 exec() 按/tmp
字面意思使用路径,因此它无法找到刚刚创建的文件file_put_contents()
。PHP 函数sys_get_temp_dir()
只是返回/tmp
,并且我找不到任何包含该路径的环境变量。有没有办法以编程方式获取该路径?或者我需要关闭 PrivateTmp 吗?或者有更好的方法来做我需要做的事情吗?是的,我可以创建自己的具有广泛开放权限的特殊位置,但似乎只使用正常的临时目录应该更干净。
在我看来,只有两个选择:
不要使用/tmp
您在应用程序的配置文件中预定义的不同目录。我最近做了类似的事情,我使用/var/run/myapplication
目录而不是/tmp
. (我还必须添加一个 cron 作业来清理它。)
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)