当通过nginx

时间:2015-05-25 19:33:44

标签: php nginx centos7 tmp

我发现有关php/tmp文件夹的奇怪行为。 Php在使用/tmp时使用另一个文件夹。 PHP 5.6.7,nginx,php-fpm。

我以两种方式执行相同的脚本:通过浏览器和通过shell。但是当它通过浏览器启动时,文件不在真正的/tmp文件夹中:

<?php
$name = date("His");

echo "File /tmp/$name.txt\n";

shell_exec('echo "123" > /tmp/'.$name.'.txt');

var_dump(file_exists('/tmp/'.$name.'.txt'));

var_dump(shell_exec('cat /etc/*release | tail -n 1'));

php -f script.php

File /tmp/185617.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

文件在哪里?在/ tmp

$ find / -name 185617.txt
/tmp/185617.txt

如果通过http://myserver.ru/script.php访问,我会

File /tmp/185212.txt
bool(true)
string(38) "CentOS Linux release 7.0.1406 (Core)

但文件在哪里?

$ find / -name 185212.txt
/tmp/systemd-private-nABCDE/tmp/185212.txt

为什么php认为/tmp应该在/tmp/systemd-private-nABCDE/tmp

3 个答案:

答案 0 :(得分:31)

因为systemd is configured to give nginx a private /tmp。如果您必须使用system / tmp而不是出于某种原因,那么您需要修改.service文件以读取&#34; PrivateTmp = no&#34;。

答案 1 :(得分:1)

如果您在服务器上运行多个站点,那么我认为您将要保留PrivateTmp = yes,以便每个站点保持隔离,即使它使用临时文件也是如此。可能是一个安全问题,我想。

答案 2 :(得分:0)

伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)的答案正确,但让我添加我的功能性解决方案。

我已经尝试了“ multi-user.target.wants”解决方案,该解决方案有效,但是在重新启动之后,但是在某些时候,PrivateTmp恢复为true。 就像我对Apache2的主要使用是PHP一样,我终于编辑了php.ini,并且取消了sys_temp_dir行的注释。

默认情况下,系统使用由函数sys_get_temp_dir分配的temp dir。函数sys_get_temp_dir将返回“ / tmp”,但事实是您的tmp文件存储在/tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-apache2.service-YYYYYY//tmp/*这样的路径下。所以,对我来说工作是:

编辑php.ini(路径可以在PHP版本之间更改)

sudo nano /etc/php/7.2/cli/php.ini

然后取消注释sys_temp_dir行

; Directory where the temporary files should be placed.
; Defaults to the system default (see sys_get_temp_dir)
sys_temp_dir = "/tmp"