【PHP】mkdirのパーミッション(属性)の指定が機能しない原因
先日、mkdir関数を使ってパーミッションを「0777」に指定してディレクトリを作成したのですが、パーミッションは「0755」となっていました。
「おかしいな・・」と思い、mkdir関数のリファレンスを見たらその原因がわかりました。
原因:umaskの影響を受ける
「困ったときはリファレンスだ!」ということでmkdir関数のリファレンスを確認すると
モード(パーミッション)は、現在設定されているumaskの影響も受けます
umaskを変更するにはumask()を使用します
とバッチリ書いてありました。
umaskとは?
OSで設定されているもので、デフォルトのパーミッション指定みたいなものです。
作成するファイルまたはディレクトリのパーミッションはumaskの設定値によって次のようになります。
- ファイルの場合:「0666 - umaskの設定値」となる
- ディレクトリの場合:「0777 - umaskの設定値」となる
umaskの設定確認
umaskの設定は「umask」コマンドで確認できます。
例えば、私が使っているさくらインターネットのスタンダードプランで確認したところumaskは「0022」となっていました。
そのためパーミッション「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関数を使う方法の方がよい。
あわせて読んでほしい!
コメント
まだコメントはありません。