web-dev-qa-db-ja.com

PHPは、nginx経由でアクセスされた場合、/ tmp / systemd-private-nABCDE / tmpに独自の/ tmpを持っています

phpおよび/tmpフォルダーに関する奇妙な動作を発見しました。 Phpは/tmpで動作するときに別のフォルダーを使用します。 PHP 5.6.7、nginx、php-fpm。

ブラウザとシェルの2つの方法で同じスクリプトを実行します。ただし、ブラウザ経由で起動した場合、ファイルは実際の/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にあるべきだと考えているのですか?

22
shukshin.ivan

systemdはnginxにプライベート/ tmpを与えるように構成されている だからです。何らかの理由でmust代わりにシステム/ tmpを使用する場合は、.PrivateTmp = noを読み取るように.serviceファイルを変更する必要があります。

サーバーで複数のサイトを実行している場合は、PrivateTmp = yesのままにして、一時ファイルを使用する場合でも各サイトが分離されたままになるようにしたいと思います。それ以外の場合はセキュリティの問題である可能性があります。

1
Artis

Ignacio Vazquez-Abramsが正解ですが、機能的なソリューションを追加しましょう。

「multi-user.target.wants」ソリューションを試しましたが、うまくいきましたが、再起動後、PrivateTmpがtrueに戻ります。 Apache2の主な用途がPHPであるように、私は最終的にphp.iniを編集し、sys_temp_dir行のコメントを外しました。

デフォルトでは、システムは関数sys_get_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"
0
Benjamin