ファイルのパーミッションを確認する
[PHP]ファイルのパーミッションを確認する
areFileperms
ファイルのパーミッションを確認する。
ファイルへのパス(filename)を文字列で渡してパーミッション(perms)を 0777 などの8進数で渡す。
また、対象のファイル情報についてキャッシュを削除したい場合はrefreshをtrueとする。
返り値はboolean。 対象のファイルが指定のパーミッションであった場合にtrueとなり、そうでなければfalseとなる。
filepermsOctStr
ファイルのパーミッションを8進数の文字列で取得する。
対象のファイル情報についてキャッシュを削除したい場合は refresh を true とする。
コード
<?php function areFileperms($filename, $perms, $refresh = false) { $mode = filepermsOctStr($filename, $refresh); $perms = sprintf('0%o', $perms); return $mode === $perms; } function filepermsOctStr($filename, $refresh = false) { if ($refresh) { clearstatcache(); } if (!$perms = fileperms($filename)){ return ''; } return substr(decoct($perms), -4); }
ポイント
PHPでは8進数は先頭に0をつけることでこれを表す。
decoctの返り値は文字列。
filepermsなどファイルの情報を取得する関数では内部でシステムコールstat
を呼んでおり、PHPがその結果をキャッシュしている。
PHP5.6ではこのキャッシュの結果がchmod関数でクリアされずパーミッションを変更した後でfilepermsを行っても初めにfilepermsを実行した時点の結果が戻り続けた。
これを解消するためにはclearstatcacheを行ってキャッシュをクリアすれば良いことがわかった。