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)