【PHP】パーミッションが777のディレクトリ(フォルダ)を動的に作成する方法
2018/02/28
プログラムの仕様上、パーミッションが 777 のディレクトリ(フォルダ)を、元から用意せずに動的に作成する必要がったので、その作り方となぜ初期状態では出来ないのかを忘備録としてポストします。
そもそもですが、パーミッション(ファイルパーミッション:file permission)とは、ファイルごとに定義された、読み出し・書込みなどのアクセスに対する許可情報のことです。多くは八進数表記となります。
これを踏まえた上でのポストになります。
mkdirで作成したディレクトリのパーミッションが777とならない理由
UNIXの「umask」の設定によりけり
PHPの mkdir() でディレクトリを作成した場合、パーミッションは(サーバの設定によりますが)大体 0755、ファイルを作成した場合は 0644 となると思います。(最初の0は8進数表記によるもの)
これは LINUX など UNIX系のサーバの場合に umask (ユーマスク)という設定がなされているため。
ターミナル等で umask と打つと設定されている値が表示されるのですが、大体「0022」となっていることが多いです。
1 2 |
$dir = 'aaa'; mkdir($dir, 0777); |
上記のように、あえてパーミッションを「0777」と指定して mkdir() を実行しても、umaskで設定されている 0022 でマスク(引き算)され 0755 となってしまう訳。
概念図はこんな感じ。
0777 ←permission値
-0022 ←umask値
-----
0755 ←結果値
パーミッション0777のディレクトリを作る方法
ではどうやったら 0777 のディレクトリが出来上がるのか。
元々の umask 値をUNIX側の設定で変えてしまっても良いのですが、それはそれで不都合が出るやも知れないので、もうちょっと穏やかで簡単な方法をとってみたいと思います。
1 2 3 |
$dir = 'aaa'; mkdir($dir, 0777); // ←(マスクされるので)値は何でも良い chmod($dir, 0777); // ← chmod関数でパーミッション変更 |
ディレクトリを作ったあとに、chmod() するだけで出来上がってしまいます。
長々と説明した割には、コロンブスの卵的な簡単な方法ですね。