ラボ > PHP:ファイル関連、サーバ

PHP パーミッションの取得、変更(chmod()、fileperms())

ブラウザとコンソールで何かを出力させたりすると、パーミッション絡みが面倒だったりする。

作成日:2018-06-25, 更新日:2019-09-24

経緯

▼まずは下記のような気持ち。
・「一連の処理」をコンソールで実行して、ログ出力させたかった。
・でも「一連の処理」を作成しているときはブラウザで確認したかった。

▼実際に作業に入ってからの内容
1.何も意識せずに諸々作成して、ブラウザで確認していた。ログも出力されていたし、問題無かった。
2.ひとまず完成したのでコンソールから実行して確認しようとしたらログファイルが「Permission denied」

ログファイルを確認したら
・所有者が「apache」となっている。
・コンソールにログインするときのIDは「apache」ではない・・・コレが原因か?

所有グループを確認すると「apache」。自分が所属しているグループは「apache」。
→「じゃぁ、グループ権限に書き込みを追加しよう!」と結論。

自分の情報(Linux・・・コンソールから確認):id

▼自分の所属グループの確認:コンソールから

$ id

▼結果

uid=00(XXXXXX) gid=00(apache) 所属グループ=00(apache)

※「所属グループ」ってトコを確認。

PHPでファイルのパーミッション(属性)確認:fileperms()

希望としては・・・「755」とかで出てほしいんだけど、そういうのは無いみたい。
ひとまず公式からソースをコピペして確認。

$path = 〇〇〇;
$perms = fileperms($path);

$info = '';
// 所有者
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
            (($perms & 0x0800) ? 's' : 'x' ) :
            (($perms & 0x0800) ? 'S' : '-'));

// グループ
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
            (($perms & 0x0400) ? 's' : 'x' ) :
            (($perms & 0x0400) ? 'S' : '-'));

// 全体
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
            (($perms & 0x0200) ? 't' : 'x' ) :
            (($perms & 0x0200) ? 'T' : '-'));

echo $info;

PHPでファイルのパーミッション(属性)変更:chmod()

$path = 〇〇〇;
if ( chmod($path, 0775) ) {
  echo '書き換え成功';
}
else {
  echo '書き換え失敗';
}

※「chmod($path, 0775)」を「chmod($path, 775)」とすると意図しないパーミッションになるので注意。

所有者、rootじゃない人でchmod()を実行

▼エラーになる。

Uncaught exception PhpErrorException: chmod(): Operation not permitted

chmod()は所有者、rootしか出来ないそうだ。
※オーナー変更やグループ変更も同じっぽい。

ファイルの所有者とスクリプト実行者が同じときだけchmod()させるようにする必要があるっぽい。
※参照:PHPでファイルの所有者とスクリプト実行者の取得

関連項目

PHPでファイルの所有者とスクリプト実行者の取得
ファイルの所有者、グループの変更(chown)

参考

PHP: fileperms - Manual