私は最近同じ問題を抱えていて、この質問に出くわしました。残念ながら、OPはコメントでchoppyfireballsが自分の解決策を見つけ、私たちの誰にも役立たない答えを受け入れたと述べました...その後、検索してfile_put_contentsを再び機能させることに成功した後、私は自分の解決策を共有することにしました。
私のファイルとディレクトリのパーミッションは、書き込みを受け入れるのに問題ありませんでした(ディレクトリがchmod 757
これであるかどうかを確認してください。これにより、rootや他のユーザーがその場所にファイルを書き込むことができます)。それでも機能しない場合は、システムがおそらくSELinux(Security Enhanced Linux)システムであるためです。
これを確実に記述したい場合はsetenforce 0
、selinuxをパーミッシブモードにし、スクリプトを再度実行します。それが機能する場合は、問題が十分に説明されていることを意味します。
その場合は、selinuxをオンに戻して、プロジェクトのディレクトリがあるディレクトリでsetenforce 1
試してください。ls -Zl
これはあなたに次のような行を与えるでしょう
drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project
または別の何かですが、コンテキストを1つのディレクトリからこのディレクトリに転送するためにhttpd_sys_content_t
使用した場合。ただし、ディレクトリのコンテキストを変更する必要があるため、chcon
お持ちでない場合は問題ありません。httpd_sys_content_t
public_content_rw_t
まず、ファイルを書き込むためにコンテキストを受け入れる必要があります。タイプ
setsebool -P httpd_anon_write on
これにより、(P)永続的にSELinuxブール値httpd_anon_write
がtrueに設定され、すべてのコンテキストが吹き替えられpublic_content_rw_t
、独自の場所にファイルを書き込む権限が与えられます。
ここで、プロジェクトディレクトリがSELinuxであると言わなければpublic_content_rw_t
なりません。そうしないと、ファイルを書き込めなくなります。タイプ :
semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
そして、 selinuxに上記の仕様を適用するようrestorecon -RvF /project
に指示します。
これで、ディレクトリはpublic_content_rw_tになり、ファイルを書き込めるようになります。