即使脚本、父文件夹和目标文件都归同一用户所有,fopen也会失败


fopen failes even if the script, the parent folder and the target file, all are owned by same user

即使服务器上激活了安全模式,如果脚本文件、目标文件和父文件夹归同一用户所有,fopen也应该可以正常工作。你知道为什么会这样吗?这些文件具有755权限。感谢您的时间和努力。

$filename="file.html";
echo "Current User: ".get_current_user()."; UID: ".getmyuid()."; GID: ".getmygid()."<br/>";
echo "Current PID: ". getmypid() . "<br/>";
echo "Parent folder owner: ". fileowner(".") . "<br/>";
echo "$filename owner: " . fileowner($filename) . "<br/>";
echo "Current folder is writable: " . is_writable($filename);

输出:

当前用户:vnnamp;UID:3024;GID:32026父文件夹所有者:32024file.html所有者:32024当前文件夹可写:错误

您确定您的脚本在正确的目录中运行吗?

如果不是,那么您传递的文件名可能不存在,这就是is_writable()返回false的原因。使用getcwd()打印出脚本正在运行的目录(可以使用chdir()设置(或使用绝对文件名。

编辑:只是总结一下下面的讨论:

  • 尝试绝对路径名:否
  • 检查php.ini和httpd.conf中打开的basedir:否
  • 尝试用$_SERVER['DOCUMENT_ROOT']前缀路径:否
  • getmyuid((返回脚本文件所有者而非进程所有者使用检查不匹配的文件所有者和进程用户posix_getpwuid(posix_geteuid()):是的,问题的原因

如果用户是文件的所有者,并不意味着文件应该由用户写入。它可能具有类似0444的权限。

is_writeble((函数的结果被缓存。尝试使用clearstatcache() 清除