I currently have a php script that is running when a browser browser browses to the webpage. What I'm trying to do is write a text file when the script runs that stores a variable. The owner of the folder is apache, but everyone has read write, strictly for testing purposes. (I thought it might be a permissions issue) SELINUX is enabled on the server, and when I run the script from console it creates the text file just fine, and in the right directory.
file_put_contents("My working file location", $myString);
I'm using this line to try to write and create the text file, I know that my file location works becaus I can run it and create it in offline mode, I.E. running it through console. The problem is that the variable I'm trying to write is populated through HTTP Post, and when I run the script through the browser, or when apache runs the script, it does not write or create the file. What do I need to do to allow access to write/change syntax wise to get this script to write this text file?
Have you tried chmodding the directory to
777
?Try this:
Might of misspelled something. ^
Your problem is likely due to apache not having permissions to write to the file location you specified. Go to that directory and check the permissions and group ownership with the
ls
command:There are three columns in the output that show the permissions, owner, and group for the directory. Most likely they are owned by root and don't have permissions for
apache
to write to the directory.If this is the case, then you will see an error appear in your apache log when it tries to create the file. Try tailing your logs while running the script in your browser:
I had the same trouble recently and stumbled upon this question. Unfortunately choppyfireballs the OP said in a comment he found his own solution and just accepted an answer that wasn't helping any of us... Then after a search and a success to make file_put_contents work again I decided to share my solution.
The permissions of my files and directories were ok to accept any writing (make sure your directories are
chmod 757
this will give the root and others the grant to write files in the location). If it still doesn't work like it didn't for me, that's because your system is probably SELinux (Security Enhanced Linux) system.If you want to make sure write
setenforce 0
this will turn selinux to permissive mode, run your script again, if it works then it means the problem is well described.In that case turn selinux on back
setenforce 1
and tryls -Zl
in the directory where the directory of your project is. this will give you a line likeor something different but
httpd_sys_content_t
if you usedchcon
to transfer the context from one directory to this one. but if you don't havehttpd_sys_content_t
it's ok because we need to change the context of that directory anyways.first you need to accept any
public_content_rw_t
contexts to write file. TypeThis will set (P)ermanently SELinux boolean
httpd_anon_write
to true and any context dubbed aspublic_content_rw_t
will have the rights to write any files in their own location.Now you have to say SELinux that your project directory is
public_content_rw_t
or you'll still not be able to write files. Type :and
restorecon -RvF /project
to tell selinux to apply the above specifications.Now your directory is public_content_rw_t and you should be able to write files.
I ran into this problem too. In my case, I found that the ownership of the directory was wrong. For a typical Apache installation the directory should be owned by www-data:www-data, not root:root.
I'm note sure if my solution is really clear but it worked :
Best regards