ファイルのパーミッションを確認する

[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を行ってキャッシュをクリアすれば良いことがわかった。

参考