私はopen_basedirを持っていません、phpは/ etc/usr/proc/homeなどにアクセスできますが、/ tmpにはアクセスできません。
tmpfsは/ tmpにマウントされています(/ tmp type tmpfs(rw))。これは、/ tmpフォルダーを使用する理由でもあります。
私のファイルはhttp(nginxとphpのユーザー)が所有し、誰でも読み取り可能です。
Sudo -u http cat /tmp/file
は機能していますが、phpスクリプト内のすべてが機能しません(file_exist()やfile()など)。
編集:ログにエラーが表示されます:
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:私は問題を別の方法でテストしました。私が作った
touch("/tmp/boo");
file_exist("/tmp/boo");
file_existはtrueを返すため、ファイルが作成されます。次に、/ tmpの内部を監視しましたが、「boo」ファイルが見つかりません。それは私が恐れていたものです、phpはマウントポイントを「参照」しません。それはなぜですか、どうすれば修正できますか?
なぜ誰かが私にグローバルなヒントをくれたのかを見つけました。
これはphpやtmpfsのせいではありません。犯人はsystemdで、セキュリティシステムはPrivateTmp
でした。
私が行ったのと同じ問題に遭遇した人のために、サービスphp(およびおそらく他のいくつか)には、systemdスクリプト(/usr/lib/systemd/system
)のPrivateTmp
に対するtrue
オプションがあります。
その場合、新しい/tmp
が作成され、他のものから分離されます。サービスが停止すると、内部に保存されているすべてのデータが削除されます。
/tmp
には多くの機密情報が含まれる可能性があり、phpスクリプトは常に安全であるとは限らないため、これはセキュリティ対策です。
これを無効にするには、/etc/systemd/system
内にスクリプトをコピーし(更新後に変更が上書きされないようにするため)、PrivateTmp
をfalse
に設定します。
JoinsNamespaceOf
を使用して、同じ/ tmpを共有するように2つ以上のサービスを設定することもできます。
詳細情報> man systemd.exec