PHP'is_writable'返回false,虽然从终端查看它显示775

时间:2015-01-20 15:20:48

标签: php apache terminal file-permissions

我在使用生产服务器中的克隆设置开发服务器时遇到问题。我们使用CMS,似乎它的一些脚本存在权限问题。我们试图找到它的底部,我们设置了一个PHP脚本来测试权限,并进入终端来比较它的发现。

我们的测试脚本如下

//try one of the essential folders of the CMS
$path= '[our_base_dir]/html/cms/content'

echo $path.' is'.(!is_writable($path) ? ' NOT' : '').' writable.<br/>';

打印

[our_base_dir]/html/cms/content is NOT writable.

然而,当进入终端时,我不明白为什么会这样。这是输出:

$ getfacl content
# file: content
# owner: cchapman
# group: cchapman
user::rwx
user:apache:rw-
group::rwx
mask::rwx
other::r-x

$ grep 'cchapman' /etc/group
cms:x:510:cchapman,apache
cchapman:x:512:cms,apache

我认为apache用户是需要具有写访问权限的用户,而cmscchapman用户只是文件所有者,具体取决于他们的创建方式。在任何情况下,所有三个都应该能够根据组权限读取和写入彼此的文件。

在文件级别和目录级别上也是如此。我唯一的想法是在文件级别处理Apache用户的方式出了问题。可能是吗?或者还有什么可以提供不同的访问权限?

1 个答案:

答案 0 :(得分:1)

我怀疑我的评论实际上是答案,所以我将其作为一个发布:

通过在路径字符串is_writable上调用/html/cms/content,您需要检查绝对路径/html/cms/content是否可写。我相信你想要的是:

$path = realpath('./html/cms/content');//note the .
if (is_writable($path))
    printf('"%s" is writable', $path);

如果您正在检查的路径 /html/cms/content,那对我来说似乎很奇怪(我期待/var/www/base_dir/html/cms/content或其他),那么一定要得到realpath(即:没有符号链接和所有这些)。所以请始终致电realpath(正如我在上面的代码段中所做的那样)。

除此之外:您有一个apache用户,这很好,但您确定该用户正在执行该脚本吗? www-datanobody也很常见。检查用户实际运行的代码,并确保用户也拥有相应的权限。