LoginSignup
4
0

More than 5 years have passed since last update.

phpでmkdir($path, 01777)というコードは正しいのか?

Posted at

たまたま見ていた↓のようなコードがあり、これはそもそも失敗するのでは?と手元の環境で実行したところ成功してしまい「はてな、何故成功するのだ?」と疑問に思ったので調べてみた。

mkdir($dir_path, 01777);

まずは公式ドキュメントを参照する。
$modeのデフォルト値はint型の0777で8進数を指定している。
ここまでは問題ない。

モードに関する詳細は chmod() をご覧ください。

とあるので確認する。

mode 引数は 3 つの 8 進法による数値で構成され、 所有者自身、所有者が属するグループ、その他のユーザーの順で アクセス制限を設定します。一つ一つの数字はそのターゲットに対し 許可を与えます。1 は実行権限、2 はファイルに対する書き込み権限、 4 はファイルに対する読み込み権限を与えます。 必要な権限にあわせ数値を加算してください。

そらそうだと言う感じ。
$modeは8進数で表すので先頭の0はファイルを指すことになる。ここまではよい。問題はそのあとの1だ。
これは↑の説明をみるに実行権限の設定を行っているだがそれは何に対して行っているのか?

問題はそこだ。

PHPの公式に書かれてないぞー?とか思ったらしたの方にそれらしき記述を発見。

pmichaud at pobox dot com ¶

どうやら仕様上設定できるのは問題ないらしい、えー。

なるほど、わからん!となったのでググったら出た。

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にエントリ書いた。

4
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0