我已将文件权限设置为777但我无法使用PHP写入该文件。
我可以在我的FTP客户端清楚地看到该文件具有0777权限,当我这样做时:
echo (true === is_writable('file.txt')) ? 'yes' : 'no';
我得到'不';
我也尝试过:
echo (true === chmod('file.txt', 0777)) ? 'yes' : 'no';
结果相同。
目录列表如下:
public_html
public 0777
css 0755
js 0755
file.txt 0777
我正在使用.htaccess文件将所有流量重定向到公共子文件夹。当然,我已将文件排除在重写之外(可以从我检查的浏览器访问):
RewriteRule ^(file).* - [L]
为什么?
答案 0 :(得分:8)
我猜Apache的运行方式与拥有该文件的用户/组不同。在这种情况下,文件本身必须是0777
。
public
只需0777
。即使文件夹本身不是0777
,如果文件是,并且文件夹至少为5
用户(read/execute
),您应该能够写入该文件。 / p>
最后,您的文件树应如下所示:
public_html
public
file.txt 0777
当然,您无法使用PHP更改这些权限,但您可以通过FTP客户端进行更改。
如果它仍然无法正常工作,PHP可能正在安全模式下运行,或者您可能正在使用PHP Suhosin等扩展。您可能会获得更好的结果,将文件的所有者更改为运行该脚本的同一用户/组。
要获取正在执行的用户的用户/组ID,您可以使用以下命令:
<?php
echo getmyuid().':'.getmygid(); //ex:. 0:0
?>
然后,您可以使用chown
(在终端中)更改文件的所有者:
> chown 0:0 file.txt
答案 1 :(得分:2)
在opencart中,我在安装vqmod并提供所有必要的权限后遇到了这个错误。
经过一番研究,找到了它。“MODS CACHE PATH NOT WRITEABLE”实际上是指vqmod文件夹本身,而不是缓存文件夹。
sudo chmod -R 777 vqmod
在你的根目录中.....
答案 2 :(得分:1)
您必须在创建文件后立即chmod该文件。
function Doo_Chmod($path, $chmod = null)
{
if (file_exists($path) === true)
{
if (is_null($chmod) === true)
{
$chmod = (is_file($path) === true) ? 644 : 755;
if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true)
{
$chmod += 22;
}
}
return chmod($path, octdec(intval($chmod)));
}
return false;
}
答案 3 :(得分:-1)
与上述问题没有严格关系,但我还是会把它放在这里供以后的访问者使用,因为我是在这里阅读标题的。 来自arch wiki:
<块引用>除了控制用户和组读、写的文件模式位 和执行权限,几个文件系统支持文件属性 允许进一步定制允许的文件操作。这 部分介绍了其中一些属性以及如何使用它们。
警告:默认情况下,cp、rsync、 和其他类似的程序。 chattr 和 lsattr
对于 ext2 和 ext3 文件系统,e2fsprogs 包包含 列出和更改文件属性的程序 lsattr 和 chattr, 分别。尽管并非所有文件系统都支持某些文件,但 可用的属性是:
a: append only
c: compressed
d: no dump
e: extent format
i: immutable
j: data journalling
s: secure deletion
t: no tail-merging
u: undeletable
A: no atime updates
C: no copy on write
D: synchronous directory updates
S: synchronous updates
T: top of directory hierarchy
例如,如果要在某个文件上设置不可变位,请使用 以下命令:
# chattr +i /path/to/file
要删除文件的属性,只需将 + 更改为 -。
对于没有附加属性的文件,lsattr
如下所示:
$ lsattr /etc/hosts
-------------e- /etc/hosts