たまたま見ていた↓のようなコードがあり、これはそもそも失敗するのでは?と手元の環境で実行したところ成功してしまい「はてな、何故成功するのだ?」と疑問に思ったので調べてみた。
mkdir($dir_path, 01777);
まずは公式ドキュメントを参照する。
$mode
のデフォルト値はint型の0777
で8進数を指定している。
ここまでは問題ない。
モードに関する詳細は chmod() をご覧ください。
とあるので確認する。
mode 引数は 3 つの 8 進法による数値で構成され、 所有者自身、所有者が属するグループ、その他のユーザーの順で アクセス制限を設定します。一つ一つの数字はそのターゲットに対し 許可を与えます。1 は実行権限、2 はファイルに対する書き込み権限、 4 はファイルに対する読み込み権限を与えます。 必要な権限にあわせ数値を加算してください。
そらそうだと言う感じ。
$mode
は8進数で表すので先頭の0はファイルを指すことになる。ここまではよい。問題はそのあとの1
だ。
これは↑の説明をみるに実行権限の設定を行っているだがそれは何に対して行っているのか?
問題はそこだ。
PHPの公式に書かれてないぞー?とか思ったらしたの方にそれらしき記述を発見。
どうやら仕様上設定できるのは問題ないらしい、えー。
なるほど、わからん!となったのでググったら出た。
PHPのディレクトリ権限変更系を3ケタの数字で設定すると陥る罠と理由
つまりSticky BitというLinuxの特殊なアクセス権限を指定しているらしい。
$ ls -la
-rw-r--r-- 1 luccafort staff 0 2 23 15:15 test.log
$ chmod 01644 test.log
-rw-r--r-T 1 luccafort staff 0 2 23 15:15 test.log
権限の末尾がT
になっている、なるほど。
ということで書かれたコードが正しかったというオチになった。
0xxx
と指定するのが当たり前だと思っていたので疑問にも思わなかったけどたまーにこういうことに遭遇すると自分の知識のなさが恥ずかしい。
恥ずかしいことはドンドン放流して行く所存ということで久しぶりにQiitaにエントリ書いた。