PHPのtouch()関数を使っってファイルを作成したいのですが、以下のようなエラーが出ます

Unable to create file [ファイルパス] because Permission denied,
ファイルを作成するディレクトリのパーミッションは777に設定していますが、
エラーが消えません…
パーミッション以外にはどんな原因が考えられるでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/24 18:55:03

ベストアンサー

id:taroe No.3

回答回数1099ベストアンサー獲得回数132

シンボリックリンクに対して
chmod 777
とかしてませんか?

だから、実際のディレクトリのパーミッションが777になっていない。

どちらにせよ、
touch()でエラーになる前に
パーミッションを表示するコードを入れればはっきりすると思う。

その他の回答2件)

id:uwao No.1

回答回数180ベストアンサー獲得回数39

サーバーによりますが、「777」のディレクトリ内にファイルを作成出来なくなるサーバーがあります。
おそらく、安全性を考慮して、「誰でも読み書き実行全て許可する」というのは駄目という事だと思います。
「757」や「755」などに設定すると作成出来るかもしれません。

id:k-motoyan123

パーミッションの組み合わせは色々試してみたのですが、
どれも結果は同じでした…

2012/02/20 09:44:20
id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ACLが有効になってる可能性も。
http://www.itmedia.co.jp/enterprise/0403/06/epn01.html
というかOSはなんです?

id:TransFreeBSD

コメント見逃してました。すみません。

2012/02/18 23:51:25
id:k-motoyan123

ACLのオプションを確認してみましたが、無効になっているようです

2012/02/20 09:40:18
id:taroe No.3

回答回数1099ベストアンサー獲得回数132ここでベストアンサー

シンボリックリンクに対して
chmod 777
とかしてませんか?

だから、実際のディレクトリのパーミッションが777になっていない。

どちらにせよ、
touch()でエラーになる前に
パーミッションを表示するコードを入れればはっきりすると思う。

  • id:k-motoyan123
    追記:環境は以下のとおりです
    CentOS5.5 32bit
    Apache2.2.9
    PHP5.2.6

    mkdir()関数についてはエラーなく実行出来ますが、
    touch()関数では新たな空ファイルの作成ができません
  • id:tdoi
    可能性としては、セーフモードが臭い気がしますけど、ONになってます?
    fopenでは、ファイルつくれるのですか?
  • id:a-kuma3
    touch() で指定するファイル名は、フルパスで書いてますか?
    touch() には、ファイル名だけ指定してますか? それとも、時刻も指定してますか?
  • id:deep_one
    問題発生箇所の数行が貼られていると分かりそうだけど…
  • id:TransFreeBSD
    touchを単純にmkdirに変えると(同じパス同じ名前で)エラーが発生しないとしたら理由が分からない。
    パーミッションもACLも厳しく設定してあるなら、そ霊前にパーミッション変えたりスクリプトの実行が出来なかったりする可能性が高い。
    #ただACLならそういう細かい設定が可能なのかもしれない←未確認
    safe_modeやopen_basedirの制限だとエラーメッセージが違う。

    という気がする。
  • id:k-motoyan123
    セーフモードを確認してみましたが、設定はoffになっていました。

    該当箇所のコードは以下のようになっています
    if (!file_exists($file)) {
    touch($file);
    chmod($file, $this->_perm);
    }

    $fileには事前に作成するファイルのフルパスがFWから設定されています
    ファイルが無かったら作成するということで時間指定のパラメタはきっていません。
  • id:k-motoyan123
    fopen()、mkdir()関数を試してみました。
    touch()を行なっているモジュール内で記述してみたところ、
    どちらも権限が無いとエラーが起こり、

    mkdir()が可能なモジュール内ではtouch()も問題なく出来るようです。
    (説明不足で申し訳ありません…)

    エラーが起こっているモジュールはシンボリックリンクとして参照しており、
    パーミッションやユーザの設定が問題になっているのかもしれないです
  • id:k-motoyan123
    以下のディレクトリ内については実行可能
    /home/user/module

    以下のディレクトリを参照する処理では実行不可
    /home/user/FW -> /use/local/php/lib/FW/module
  • id:TransFreeBSD
    成功する場合、成功しない場合でそれぞれ、カレントディレクトリ(getcwd()の結果)、実効ユーザID(posix_geteuid()の結果)、touchに渡した文字列($fileの中身)を比較してはどうでしょう?想定と違う可能性があるのでは?
  • id:k-motoyan123
    根本的な原因が分かったわけではないのですが、
    利用する全てのモジュールのパーミッションを777にすることでとりあえずは解決しました。
    (実際に動かすのにパーミッション777は危険ですが…)

    色々と回答やコメントを頂き有難うございました。

    もっと自分で調査する力を高めていきたいです。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません