Can't write to /tmp with php, despite 777 permissions and no open_basedir value

非 Y 不嫁゛ 提交于 2019-12-06 16:50:50

问题


I'm trying to write a file to my /tmp directory (on an apache server) with the php fopen function, but it fails:

<?php
$handle = fopen("/tmp/test.txt", "x");
if ($handle) 
   echo "Success!";
else 
    print_r(error_get_last());

This returns the error message:

failed to open stream: No such file or directory.

The /tmp directory has permissions set to drwxrwxrwt and I can see that the web user is writing other files to it. Mysteriously, if I point the script to another folder with permissions 777, it returns success. But my open_basedir has no value. I have safe_mode=on and allow_url_fopen=off, but I don't think that should explain it?

This is PHP 5.3.10 on Apache Httpd 2.0.


回答1:


I had exactly the same problem. PHP reported no problem with opening file in /tmp/myoutputfile, but no file was in that path. Then I did

find / -name "myoutputfile"

and found it in /tmp/systemd-…/myoutputfile. I've found this article on Google.
So, in my case, it was a Systemd and Apache Httpd combination. I hope this will help to someone.




回答2:


Your problem is likely caused by the combination of systemd and apache. It's a security feature called PrivateTmp, and obviously it's an opt out.

If you don't want it, you can disable it like this:

  1. Outcomment the respective switch in /etc/systemd/system/multi-user.target.wants/apache2.service: #PrivateTmp=true
  2. Restart systemd: sudo systemctl daemon-reload
  3. Restart apache: sudo systemctl restart apache2



回答3:


According to the error message displayed, there is no folder /tmp/. Perhaps the tmp folder is somewhere else than the root?

This error will not show if the file actually doesn't exist, as it will attempt to create it.

Method x also returns a warning if the file already exists. (doc: http://www.php.net/manual/en/function.fopen.php)

I think this also goes for another reason this could go wrong, is the user which executes PHP doesn't have rights to write in the /tmp/ folder.




回答4:


Try to add /tmp to open_basedir. For example:

    php_admin_value open_basedir /some/path:/another/path:/tmp

I'm not sure this is the problem you actually faced, but I found your question while looking for this solution so I guess that might help someone else.



来源:https://stackoverflow.com/questions/10752396/cant-write-to-tmp-with-php-despite-777-permissions-and-no-open-basedir-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!