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
にあるべきだと考えているのですか?
systemdはnginxにプライベート/ tmpを与えるように構成されている だからです。何らかの理由でmust代わりにシステム/ tmpを使用する場合は、.PrivateTmp = noを読み取るように.serviceファイルを変更する必要があります。
サーバーで複数のサイトを実行している場合は、PrivateTmp = yesのままにして、一時ファイルを使用する場合でも各サイトが分離されたままになるようにしたいと思います。それ以外の場合はセキュリティの問題である可能性があります。
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"