PHP 'is_writable' 返回 false,尽管从终端查看它显示 775
PHP 'is_writable' returning false, although viewing it from the terminal shows 775
我在设置基于生产服务器克隆的开发服务器时遇到问题。我们使用 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
用户是需要具有写入权限的用户,而 cms
和 cchapman
用户将只是文件所有者,具体取决于他们的情况创建。不管怎样,三个人应该都可以根据组权限读写彼此的文件。
这在文件级别和目录级别都是一样的。我唯一的想法是,Apache 用户在文件级别的处理方式出了问题。可能是这样吗?或者还有什么可以提供不同的访问权限?
我怀疑我的评论实际上就是答案,所以我 post 将其作为一个:
通过在路径字符串 /html/cms/content
上调用 is_writable
,您正在检查 absolute 路径 /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-data
和 nobody
也很常见。检查您的代码实际上是哪个用户 运行,并确保该用户也具有适当的权限。
我在设置基于生产服务器克隆的开发服务器时遇到问题。我们使用 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
用户是需要具有写入权限的用户,而 cms
和 cchapman
用户将只是文件所有者,具体取决于他们的情况创建。不管怎样,三个人应该都可以根据组权限读写彼此的文件。
这在文件级别和目录级别都是一样的。我唯一的想法是,Apache 用户在文件级别的处理方式出了问题。可能是这样吗?或者还有什么可以提供不同的访问权限?
我怀疑我的评论实际上就是答案,所以我 post 将其作为一个:
通过在路径字符串 /html/cms/content
上调用 is_writable
,您正在检查 absolute 路径 /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-data
和 nobody
也很常见。检查您的代码实际上是哪个用户 运行,并确保该用户也具有适当的权限。