PHP is_writable 在 NFS 上始终为 false

PHP is_writable 在 NFS 上始终为 false

抱歉,我不确定这是否是正确的论坛,因为我不知道我所面临的问题的原因。

我在 Raspbian(Stretch 9)上安装了 NextCloud,并将数据目录移动到已挂载的 NFS 文件夹。当我尝试访问 NextCloud 时,我收到了错误消息'数据目录不可写'

因此我进行了更深入的挖掘,最终将问题隔离到 PHP7.0 和 NFS 之间的交互上:

由于某种原因,该应用程序写入目录is_writable 返回false

我创建了以下 PHP 脚本:

<?php
$dirname = '/var/churros/data/nextcloud/';
//$dirname = '/tmp/';

$myfile = fopen($dirname.'newfile.txt', "w") or die("Unable to open file!");
$txt = "John Doe\n";
fwrite($myfile, $txt);
fclose($myfile);
echo nl2br("File ".$dirname."newfile.txt written\n");

if (touch($dirname.'/chkpt.tmp')) {
   echo nl2br("touch(".$dirname."/chkpt.tmp) successful\n");
} else {
   echo nl2br("touch(".$dirname."/chkpt.tmp) failed\n");
}

if (is_writable($dirname)) {
        echo 'Directory '.$dirname.' is writable';
} else {
        echo 'Directory '.$dirname.' is not writable';
}

phpinfo();
?>

结果是

当我将目录更改为本地目录时,\tmp一切都很好 带有 /tmp 目录的“debug.php”的屏幕截图

我的 NFS 安装为

192.168.1.100:/volume1/pidata/donut on /var/churros type nfs4 (rw,relatime,vers=4.0,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.103,local_lock=none,addr=192.168.1.100)

显然用户映射和访问权限是正确的:

namei -l /var/churros/web/nextcloud/
f: /var/churros/web/nextcloud/
drwxr-xr-x root     root     /
drwxr-xr-x root     root     var
drwxr-xr-x root     root     churros
drwxr-xr-x www-data www-data web
drwxrwxr-x www-data www-data nextcloud

最后,在命令行上,作为用户 www-data,我可以访问该目录并对其进行写入。

那么:知道为什么 PHPis_writable在 NFS 目录上失败吗?

答案1

在您的代码中您声明

$dirname = '/var/churros/data/nextcloud/';

但是,当您在下面演示权限时,您显示

namei -l /var/churros/web/nextcloud/

我们怎么知道目录数据是否可以正确写入?

结果是什么:

namei -l /var/churros/data/nextcloud/

???

另外,我很好奇

if (touch($dirname.'/chkpt.tmp')) {...

在上面的脚本中起作用,它应该对 /var/churros/data/nextcloud//chkpt.tmp 起作用(注意目录:nextcloud 和文件名 chkpt.tmp 之间的双斜杠)。

我偶尔会犯错……甚至是打错的脚本,而不是完全按原样复制/粘贴……我的观点是,乍一看,OP 中似乎存在不一致之处,这些不一致之处要么在巧合满足某​​些条件时导致了错误,要么很简单,第一个变量声明需要修改为.../web/nextcloud/,以满足所述的实际目录要求……

相关内容