![PHP is_writable 在 NFS 上始终为 false](https://linux22.com/image/722797/PHP%20is_writable%20%E5%9C%A8%20NFS%20%E4%B8%8A%E5%A7%8B%E7%BB%88%E4%B8%BA%20false.png)
抱歉,我不确定这是否是正确的论坛,因为我不知道我所面临的问题的原因。
我在 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();
?>
结果是
- 在数据目录中创建 newfile.txt,其中包含给定的文本(约翰·多伊)
- Touch成功,即检查点文件已创建
is_writable
返回 false 带有 NFS 目录的“debug.php”的屏幕截图
当我将目录更改为本地目录时,\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/,以满足所述的实际目录要求……