【PHP】mkdirのパーミッション(属性)の指定が機能しない原因

公開日:
更新日:
カテゴリー: PHP

先日、mkdir関数を使ってパーミッションを「0777」に指定してディレクトリを作成したのですが、パーミッションは「0755」となっていました。

「おかしいな・・」と思い、mkdir関数のリファレンスを見たらその原因がわかりました。

原因:umaskの影響を受ける

「困ったときはリファレンスだ!」ということでmkdir関数のリファレンスを確認すると

モード(パーミッション)は、現在設定されているumaskの影響も受けます
umaskを変更するにはumask()を使用します

とバッチリ書いてありました。

umaskとは?

OSで設定されているもので、デフォルトのパーミッション指定みたいなものです。

作成するファイルまたはディレクトリのパーミッションはumaskの設定値によって次のようになります。

  • ファイルの場合:「0666 - umaskの設定値」となる
  • ディレクトリの場合:「0777 - umaskの設定値」となる

umaskの設定確認

umaskの設定は「umask」コマンドで確認できます。

例えば、私が使っているさくらインターネットのスタンダードプランで確認したところumaskは「0022」となっていました。

さくらインターネットのumaskの設定

そのためパーミッション「0777」を指定してディレクトリを作成しようとすると

0777 - 0022 = 0755

で「0755」となります。

また、パーミッション「0666」を指定してファイルを作成しようとすると

0666 - 0022 = 0644

で「0644」となります。

まとめ

つまり、

  • パーミッションの指定をしない
  • ディレクトリのパーミッションを「0777」に指定
    ファイルのパーミッションを「0666」に指定

の場合、新規にファイルまたはディレクトを作成すると

  • ファイルのパーミッションは「0644」
  • ディレクトリのパーミッションは「0755」

になります。

対処法

  • ディレクトリのパーミッションを「0777」にして作成したい
  • ファイルのパーミッションを「0666」にして作成したい

という場合、次の2つの方法があります。

chmod関数を使う

chmod関数を使うと簡単に対処できます。

chmod(パーミッションを変更したいファイルまたはディレクトリのパス, 変更後のパーミッションの指定);

chmod関数は、第1引数で指定されたファイル(またはディレクトリ)を第2引数で指定されたパーミッションに変更します。

<?php
//ディレクトリの作成
mkdir("hoge", 0777);

//作成した「hoge」ディレクトリはパーミッション「0777」が指定されているがumaskの影響を受けて「0755」となっている

//chmod関数で「hoge」ディレクトリのパーミッションを「0777」にする
chmod("hoge", 0777);

?>

umask関数を使う

umask関数を使用しても対処できます。

 umask(新しいumaskの設定値);

引数にumaskの設定値を渡すと、umaskはその設定値に変更されます。

<?php

//umaskの設定値を変更
umask(0);	//私のサーバーでは「0022」となっているのを「0000」に変更

//ディレクトリの作成
mkdir("hoge", 0777);

//作成した「hoge」ディレクトリはパーミッション「0777」となる(umaskの設定値を「0000」にしたため影響は受けない

?>

アテンション

umask関数を使う場合、変更後にもとのumask設定に戻す必要があります。

それは、

 【注意】
マルチスレッドな Web サーバーでこの関数を使用することは避けてください。
ファイルを生成後、chmod() を使用してファイル権限を 変更するのがより良い方法です。
全て同じ umask が使用されるので、 umask() の使用は、スクリプトを同時に実行する場合や Web サーバー自身の予期しない動作を引き起こす原因になる可能性があります。

とリファレンスの注意にあるように、umaskの設定値の変更後にどこかにトラブルを起こす可能性が生じます。

そのためumask関数を使う方法よりchmod関数を使う方法の方が良いと思います

まとめ

  • パーミッションの指定をしない
  • ディレクトリのパーミッションを「0777」に指定
    ファイルのパーミッションを「0666」に指定

の場合、新規にファイルまたはディレクトを作成すると

  • ファイルのパーミッションは「0644」
  • ディレクトリのパーミッションは「0755」

となるが、chmod関数やumask関数を使うと対処ができる。

umask関数よりchmod関数を使う方法の方がよい。

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント