くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

【Laravel】laravel4のmakeDirectoryでパーミッション777にできなかった話

laravel4のmakeDirectoryでパーミッション777にできなかった。

File::makeDirectory($path, 0777);

でやりたかったけど、パーミッション755までしかできなかった。

しかも第2引数が777ではなく、0777にしないとエラーで動かないという謎仕様。

 

追記

コメントでHiroKws様からご指摘いただき、解決しました。

777じゃなくて0777じゃないと動かないというのは8進数だからで、8進数では先頭に0をつけるのが決まりだからだそうです。ちなみに、僕が勘違いしてしまった理由を述べると、第一に知識不足なのですが、第二にapiリファレンス

http://laravel.com/api/4.1/

のmakeDirectoryに

public bool makeDirectory(string $path, int $mode = 511, bool $recursive = false, bool $force = false)

 のような(defaultは511ですよ的な)記述がされており、3桁で記述できると勘違いしてしまった。というような背景があります。

 

次に、0777を指定しても0755にしかならないのは、新規作成時のマスクが設定されているから だそうです。これに関しては少し自分で調べてみたいと思います。

 

最後にFile::makeDirectory()の中身は、PHPのmkdirだそうで、こうすることでユニットテストがしやすくなるからだそうで、もしユニットテストを書かないのなら、直接PHPの関数を呼び出す手もあるようです。

 

なるほど、HiroKws様ありがとうございました!