Ich hatte vor kurzem das gleiche Problem und bin über diese Frage gestolpert. Leider sagte Choppyfireballs, das OP sagte in einem Kommentar, er habe seine eigene Lösung gefunden und nur eine Antwort akzeptiert, die keinem von uns geholfen habe ... Dann nach einer Suche und einem Erfolg, um file_put_contents zu erstellen Arbeit wieder Ich beschloss, meine Lösung zu teilen.
Die Berechtigungen meiner Dateien und Verzeichnisse waren in Ordnung, um jegliches Schreiben zu akzeptieren (stellen Sie sicher, dass Ihre Verzeichnisse chmod 757
sind dies ergibt den Stamm und andere die Berechtigung zum Schreiben von Dateien in den Speicherort). Wenn es immer noch nicht so funktioniert wie bei mir, liegt das daran, dass Ihr System wahrscheinlich SELinux ist (Security Enhanced Linux)-System.
Wenn Sie sichergehen wollen, schreiben Sie setenforce 0
Dadurch wird Selinux in den zulässigen Modus versetzt. Führen Sie Ihr Skript erneut aus. Wenn es funktioniert, bedeutet dies, dass das Problem gut beschrieben ist.
Schalten Sie in diesem Fall Selinux wieder ein setenforce 1
und versuchen Sie ls -Zl
in dem Verzeichnis, in dem sich das Verzeichnis Ihres Projekts befindet. Dadurch erhalten Sie eine Zeile wie
drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project
oder etwas anderes, aber httpd_sys_content_t
wenn Sie chcon
verwendet haben um den Kontext von einem Verzeichnis in dieses zu übertragen. aber wenn Sie httpd_sys_content_t
nicht haben Es ist in Ordnung, weil wir sowieso den Kontext dieses Verzeichnisses ändern müssen.
Zuerst müssen Sie public_content_rw_t
akzeptieren Kontexte zum Schreiben der Datei. Geben Sie
setsebool -P httpd_anon_write on
Dies setzt (permanent) SELinux boolean httpd_anon_write
auf true und jeden Kontext als public_content_rw_t
bezeichnet haben die Rechte, alle Dateien an ihrem eigenen Speicherort zu schreiben.
Jetzt müssen Sie SELinux sagen, dass Ihr Projektverzeichnis public_content_rw_t
ist oder Sie können immer noch keine Dateien schreiben. Geben Sie ein:
semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
und restorecon -RvF /project
selinux zu sagen um die obigen Spezifikationen anzuwenden.
Jetzt ist Ihr Verzeichnis public_content_rw_t und Sie sollten in der Lage sein, Dateien zu schreiben.
Ihr Problem liegt wahrscheinlich daran, dass Apache keine Berechtigung zum Schreiben in den von Ihnen angegebenen Dateispeicherort hat. Gehen Sie zu diesem Verzeichnis und überprüfen Sie die Berechtigungen und den Gruppenbesitz mit dem ls
Befehl:
cd "My working file location"
ls -l .
Die Ausgabe enthält drei Spalten, die die Berechtigungen, den Eigentümer und die Gruppe für das Verzeichnis anzeigen. Höchstwahrscheinlich gehören sie root und haben keine Berechtigungen für apache
um in das Verzeichnis zu schreiben.
Wenn dies der Fall ist, wird in Ihrem Apache-Protokoll ein Fehler angezeigt, wenn versucht wird, die Datei zu erstellen. Versuchen Sie, Ihre Protokolle zu verfolgen, während Sie das Skript in Ihrem Browser ausführen:
tail -f /var/log/apache2/error.log