J'ai eu le même problème récemment et je suis tombé sur cette question. Malheureusement, choppyfireballs, l'OP a déclaré dans un commentaire qu'il avait trouvé sa propre solution et qu'il avait simplement accepté une réponse qui n'aidait aucun d'entre nous... Puis, après une recherche et un succès pour créer file_put_contents travailler à nouveau, j'ai décidé de partager ma solution.
Les autorisations de mes fichiers et répertoires étaient correctes pour accepter toute écriture (assurez-vous que vos répertoires sont chmod 757
cela donnera la racine et autres la subvention pour écrire des fichiers dans l'emplacement). Si cela ne fonctionne toujours pas comme pour moi, c'est que votre système est probablement SELinux (Security Enhanced Linux).
Si vous voulez vous assurer d'écrire setenforce 0
cela transformera selinux en mode permissif, exécutez à nouveau votre script, si cela fonctionne, cela signifie que le problème est bien décrit.
Dans ce cas, activez selinux setenforce 1
et essayez ls -Zl
dans le répertoire où se trouve le répertoire de votre projet. cela vous donnera une ligne comme
drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project
ou quelque chose de différent mais httpd_sys_content_t
si vous avez utilisé chcon
pour transférer le contexte d'un répertoire à celui-ci. mais si vous n'avez pas httpd_sys_content_t
ce n'est pas grave car nous devons changer le contexte de ce répertoire de toute façon.
vous devez d'abord accepter n'importe quel public_content_rw_t
contextes pour écrire le fichier. Saisissez
setsebool -P httpd_anon_write on
Cela définira (P)ermanentement SELinux booléen httpd_anon_write
à vrai et tout contexte doublé comme public_content_rw_t
aura le droit d'écrire n'importe quel fichier dans son propre emplacement.
Maintenant, vous devez dire à SELinux que votre répertoire de projet est public_content_rw_t
ou vous ne pourrez toujours pas écrire de fichiers. Saisissez :
semanage fcontext --add --type public_content_rw_t "/project(/.*)?"
et restorecon -RvF /project
dire à selinux pour appliquer les spécifications ci-dessus.
Maintenant, votre répertoire est public_content_rw_t et vous devriez pouvoir écrire des fichiers.
Votre problème est probablement dû au fait qu'Apache n'est pas autorisé à écrire à l'emplacement du fichier que vous avez spécifié. Accédez à ce répertoire et vérifiez les autorisations et la propriété du groupe avec le ls
commande :
cd "My working file location"
ls -l .
Il y a trois colonnes dans la sortie qui affichent les autorisations, le propriétaire et le groupe pour le répertoire. Très probablement, ils appartiennent à root et n'ont pas les autorisations pour apache
pour écrire dans le répertoire.
Si c'est le cas, alors vous verrez une erreur apparaître dans votre journal apache lorsqu'il essaiera de créer le fichier. Essayez de suivre vos journaux tout en exécutant le script dans votre navigateur :
tail -f /var/log/apache2/error.log