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)