windowsでの開発では特に気にしなくてもエラーにならないディレクトリなどのパーミション、十分考慮しないとunix系サーバへのアップロードでエラーがでまくる。特にcron(クーロン)などで自動実行している場合は注意が必要です。
現象
phpでパーミション「777」設定してディレクトリ作成しても「755」になってしまう。
mkdir("/path/dir", 0777); ⇒ 755
調査
phpのオンラインマニュアルで「mkdir」関数について詳しく調べてました。
注意事項について書かれていましたので引用します。
Windows では mode は無視されます。
モードは、現在設定されている umask の影響も受けます。umask を変更するには umask() を使用します。
Windowsがパーミション設定が無視するのはわかるとして、他に「umask」の影響も受けるようです。
umask とは
「ITpro」さんから引用します。
UNIXにおいて,ファイルを新規に作成する際のファイルのアクセス権限(モード)を決めるためのコマンド。ファイルを作成する際,コマンドやアプリケーションがファイルに通常設定するモードとは異なるモードにしたい場合に使う。このコマンドを使って,許可しないパーミッションを設定する。
unixでの「umask」のデフォルト値は「022」らしいです。ですので「777」で設定しても許可しないパーミション「022」が引かれて「755」になります。
対策
phpオンラインマニュアルでも書かれているとおり、umask を変更するには umask() を利用します。
umask(0);
これで 「777 - 0 = 777」になってパーミション777でディレクトリ作成できました。