【发布时间】:2018-11-15 09:30:44
【问题描述】:
对不起,我不确定,如果这是正确的论坛,因为我不知道问题的原因,我正面临。
我在 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 使用给定文本在数据目录中创建 (John Doe)
- 触摸成功,即创建检查点文件
-
is_writable返回错误 Screenshot of 'debug.php' with NFS directory - 当我将目录更改为
\tmp之类的本地目录时,一切都很好 Screenshot of 'debug.php' with /tmp directory
我的 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,我也可以访问该目录并对其进行写入。
最后,SELinux 没有在盒子上安装/启用。
那么:知道为什么 PHP is_writable 在 NFS 目录上失败或者我如何调试这个 PHP 函数吗?
【问题讨论】:
-
这里定义。 github.com/php/php-src/blob/… 虽然我看不出它失败的原因
-
is_dir返回真还是假? -
if [ -w "/var/churros/web/nextcloud" ]; then echo "WRITABLE"; else echo "NOT WRITABLE"; fi作为 www 数据运行时显示什么 -
也可以先试试 clearstatcache()
-
@FelippeDuarte - 谢谢:is_dir 返回 TRUE