こういう場面に遭遇
- mkdir()でディレクトリ作成
- 返り値は特に false を返さない
- なのにディレクトリができない・・
サーバーにはapacheを使ってます。
この問題の対処がググっても出なくて困りました。
そこで未来の自分へのメモとして、
PHPの mkdir:Permission deniedの対処法 を紹介。
このページの目次
経緯.まず問題が起こった簡単な経緯から...
こういうコードを書いてました。
1 2 3 4 5 6 7 8 9 |
/// ▼ hogeは既に存在している $path_hoge = '/var/www/html/hoge'; /// ▼ fugaは存在していない $path_fuga = $path_hoge.'/fuga'; if ( ! file_exists($path_fuga) ) { mkdir( $path_fuga, 0755, true ); $error = error_get_last(); echo $error['message']; } |
▼ こんなエラーが
1 |
"mkdir(): Permission denied" |
通常 mkdir() は成功したかどうかを true または false で返すので、詳細エラーを見たいときは error_get_last() を使えばメッセージを取得できます。それで Permission denied というエラーを発見したわけです。
この対処法には2つあります。
対処法1.パーミッションを0777にしてしまう
1つめは少し強引な対処法です。
ディレクトリのパーミッションを0777にすればOK
作成するディレクトの親に対しての操作ですね。
▼ このようなコマンドを実行
1 2 |
cd /var/www/html sudo chmod 777 hoge |
これで一応解決できます。
ただあんまりいい方法ではないかも・・・
まずパーミッションを 0777 にした時点でセキュリティ的に危なすぎるし、これは参考として一応紹介しておきます。(試さない方がグッド)
対処法2.apacheにディレクトリへの所有権を与える
もう1つの方法はapacheに所有権を与えること
作成したい親ディレクトリに対してapacheが所有権を持っていない場合、PHPから mkdir() しようとすると Permission Denided と出てしまいます。そこで apache に対象ディレクトリへの所有権を持たせてしまう、という解決策ですね。
次のようなコマンドで所有権付与できます。
▼ apacheにhogeへの所有権付与
1 2 |
cd /var/www/html/ sudo chown apache hoge |
▼ これで次コードが動くように・・
1 2 3 4 5 6 7 8 9 10 11 |
/// ▼ hogeは既に存在している $path_hoge = '/var/www/html/hoge'; /// ▼ fugaは存在していない $path_fuga = $path_hoge.'/fuga'; if ( ! file_exists($path_fuga) ) { mkdir( $path_fuga, 0755, true ); $error = error_get_last(); echo $error['message']; /// ▲ エラーが出なくなった } ``` |
パーミッションを弄らなくていいので安全
これが一番現実的な解決策と思われます。
まとめ - mkdir() Permission denideの解決は簡単
最後にまとめておきます。
当然ながら1つめの方法はよくありません。Apacheでサーバーを立ててるなら、chownコマンドでディレクトリ所有権を与えるのが現実的ですね。
以上、mkdir() Permission deniedの解決策でした。
ではまた。バイバイ(^^)/~~~