web-dev-qa-db-ja.com

PHP is_writableはNFSでは常にfalse

申し訳ありませんが、問題の原因がわからないため、これが正しいフォーラムであるかどうかはわかりません。私は直面しています。

NextCloudをRaspbian(Stretch 9)にインストールし、データディレクトリをマウントされたNFSフォルダーに移動しました。 NextCloudにアクセスしようとすると、エラーメッセージ「データディレクトリは書き込み可能ではありません」が表示されます。

だから私はもっと深く掘り下げて、最終的に問題をPHP7.0とNFSの間の相互作用に分離することができました:

何らかの理由で、アプリケーションcanはディレクトリに書き込むことができますが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として、ディレクトリにアクセスして書き込むこともできます。

だから:なぜPHP is_writableがNFSディレクトリで失敗するのか?

1
allwi

あなたのコードであなたは述べています

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

ただし、以下に権限を示すと、

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

Dir dataが適切に書き込み可能であることをどのようにして知ることができますか?

結果は何ですか:

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

???

また、私はどのように興味があります

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

上記のスクリプトで動作した場合、/ var/churros/data/nextcloud // chkpt.tmpで動作するはずです(dir:nextcloudとfilename chkpt.tmpの間の二重スラッシュに注意してください)。

私は時々タイプミスを含めました...そして、正確にコピー/貼り付けする代わりにタイプミスしたスクリプトさえ...私のポイントは、一見すると、特定の会議中にエラーの原因となっているOPの不整合があるように見えます条件が偶然に一致するか、または非常に単純に、最初の変数宣言を変更して.../web/nextcloud /を読み取り、前述の実際のdir要件を満たす必要があります。

1
bellasys