Saya tidak punya open_basedir, php dapat mengakses / etc / usr / proc / home etc… tetapi tidak / tmp.
tmpfs adalah mount pada / tmp (/ tmp type tmpfs (rw)) Itu juga alasan saya ingin menggunakan folder / tmp.
File saya dimiliki oleh http (pengguna untuk nginx dan php) dan dapat dibaca oleh semua orang.
sudo -u http cat /tmp/file
berfungsi tetapi apa pun di dalam skrip php tidak (seperti file_exist () atau file ()).
edit: kesalahan ditampilkan di log:
PHP Warning: file(/tmp/ydlw/pid): failed to open stream: No such file or directory in /srv/http/ydlw/status.php on line 267
edit2: Saya menguji masalah ini dengan cara lain. saya membuat
touch("/tmp/boo");
file_exist("/tmp/boo");
dan file_exist mengembalikan true sehingga file dibuat. Lalu saya menonton di dalam / tmp dan tidak ada file "boo" dapat ditemukan di sana. Itu yang saya takutkan, php tidak «melihat» titik mount. Mengapa begitu dan bagaimana saya bisa memperbaikinya?
/tmp/ydlw/pid
ada file ini/tmp
? Jika tidak, maka itu adalah alasan untuk pesan kesalahan.Jawaban:
Saya menemukan mengapa, seseorang memberi saya petunjuk global.
Itu bukan kesalahan php atau tmpfs. Pelakunya adalah systemd dan sistem keamanannya
PrivateTmp
.Bagi mereka yang mendapatkan masalah yang sama dengan yang saya lakukan, layanan php (dan mungkin beberapa yang lain) memiliki
PrivateTmp
opsi untuktrue
di skrip systemd (/usr/lib/systemd/system
).Dalam hal itu, yang baru
/tmp
dibuat dan diisolasi dari yang lain. Semua data yang disimpan di dalam dihapus setelah layanan dihentikan.Ini langkah pengamanan karena
/tmp
bisa mengandung banyak informasi sensitif dan skrip php tidak selalu aman.Untuk menonaktifkan ini, cukup salin skrip di dalamnya
/etc/systemd/system
(untuk menghindari menimpa perubahan Anda setelah pembaruan) dan setPrivateTmp
kefalse
.Anda juga dapat mengatur dua atau lebih layanan untuk menggunakan / tmp yang sama menggunakan
JoinsNamespaceOf
.Untuk informasi lebih lanjut>
man systemd.exec
sumber