Apache/PHP无法写入磁盘:网页触发文件写入失败求助
排查PHP网页端文件写入失败的思路
首先,先把你的脚本整理成更易读的格式:
ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); $fp = fopen('/tmp/data.txt', 'a') or die("Unable to open file!"); $txt = "Testing whether it's possible to write to a file...\n"; fwrite($fp, $txt); sleep(1); fclose($fp);
先给你点个赞,你已经做了不少正确的排查准备:确认文件所有者是www-data、Apache以这个用户运行,还开启了全量报错,这些都是排查问题的关键前提。
不过你提到用php <filename>命令调试但没说完结果,我分两种常见情况给你分析:
情况1:命令行运行脚本正常,但网页访问时没写入/报错
这种情况大概率是网页端PHP的运行环境和命令行不一样,或者有安全机制拦截:
- 检查
open_basedir限制:有些服务器会通过这个配置限制PHP能访问的目录,你可以在脚本里加一行echo ini_get('open_basedir');,看看输出里有没有包含/tmp,如果没有,就得修改php.ini或者.htconfig解除限制 - SELinux/AppArmor拦截:很多Linux发行版默认会有这类安全模块,即使文件权限正确,也会阻止Apache写入。你可以临时执行
setenforce 0关闭SELinux测试,如果能正常写入了,再去配置对应的规则允许Apache访问/tmp/data.txt - /tmp目录权限异常:虽然/tmp默认是全开放的,但如果被修改过权限,也会出问题。执行
ls -ld /tmp看看权限是不是drwxrwxrwt,确保其他用户有写入权限
情况2:命令行运行脚本也失败(弹出"Unable to open file!")
那问题大概率出在权限本身:
- 文件缺写入权限:你提到文件有执行权限,但执行权限对文件写入没用啊!得给
www-data用户加上写入权限,执行chmod u+w /tmp/data.txt试试 - ACL权限限制:有些系统会用ACL设置额外的权限规则,执行
getfacl /tmp/data.txt看看输出里有没有禁止www-data写入的规则
额外调试技巧
- 别只看网页上的报错,去看Apache的错误日志(一般在
/var/log/apache2/error.log),里面会有更详细的错误信息,比如权限被拒的具体原因 - 把脚本里的
die("Unable to open file!")改成die("Unable to open file! Error: " . error_get_last()['message']);,这样能直接拿到fopen失败的具体错误描述,比模糊的提示有用多了
内容的提问来源于stack exchange,提问作者user3019191
相关产品推荐
相关产品推荐

