• ベストアンサー

新規でファイルを作成したい

 お世話になっております。  PHPで新規でファイルを作成する方法がうまくいかないのでおしえてください。  fopen関数で、ファイルを開こうとするとき解説書にあるように、「ファイルがなければ新規で作成」というモードを使用しているのですが、このファイルが作成されません。  新規でファイルを作成するモードは、"w" "a" "a+"の筈ですが…。 $temp_file_open = fopen("temp.txt", "w"); flock($temp_file_open, LOCK_EX); $temp_return = fputs($temp_file_open, "$name\n"); flock($temp_file_open, LOCK_UN); fclose($temp_file_open);  このような形で単純に書いているのですが、なかなかうまく行きません。Perlではumaskの設定などが必要ですが、PHPでも必要なのでしょうか?  もし足りない点、または初心者が陥りやすい点を指摘していただけるとありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

ANo.1の方が書かれているように「パーミッションが不足している」可能性が一番高いです。モジュール版のphpだと実行権限はApacheなので、パーミッションの「other」が効いてきます。ファイルやディレクトリを作成・削除する上位ディレクトリのパーミッションは707(あるいは777)にしてみてください。 なお、ファイル作成後に606などにパーミッションを(chmodで)設定しておいてください(出来るようなら・・でいいと思います)。phpから作成したファイルがFTPソフトで消せないという状況が回避できます。まぁFTPで消せなくなったら削除用のスクリプトを書いてしまえばいいだけですけどね。

Tinte
質問者

お礼

 ありがとうございます。  上位のディレクトリパーミッションを変更してみたところ、新規でファイルが作成されました。生成されたファイルのオーナーを見てみるとやはりApacheでした。  PHPはまだまだ初心者なのですが、つまりはパーミッション、オーナーという辺りは自分で世話をしてやらないといけない…ということなんですね。  調べても調べても見つけられなかった問題なので、とても勉強になりました。ありがとうございます。

その他の回答 (2)

  • little-m
  • ベストアンサー率44% (45/102)
回答No.2

エラーメッセージが書かれていませんが、画面上にエラーメッセージは表示されていませんか? もし表示されていないようでしたら、fopen()の前に以下の関数を実行してみて下さい。エラーメッセージが表示されると思います。 ini_set('display_errors', TRUE);

Tinte
質問者

お礼

 ありがとうございます!  上記の通り実行してみたところ、 Warning: fopen(data.txt) [function.fopen]: failed to open stream: Permission denied in /home/xxxxxxx/public_html/xxxxxx/test.php on line 21 というエラーメッセージが出ました。はやりパーミッションの問題だったようです。今のところ手動で上位ディレクトリのパーミッションを変更してみて問題は解決いたしました。  とてもよいデバックの方法をおしえて頂いてありがとうございます!

  • jone
  • ベストアンサー率42% (6/14)
回答No.1

ファイルを作成するディレクトリのパーミッション(書き込み権限があるか)が適切に設定されているか確認してみては?また、エラーメッセージから、検索かけては如何でしょう??

Tinte
質問者

お礼

上記のお二方(shimixさんとlittle-mさん)のアドバイスでおおかたのところで問題が解決いたしました。 はやり、上位ディレクトリのパーミッションの問題でした。  PHPのfopen関数は、Apacheがオーナーになっているので上位のディレクトリが777(707)でないと書き込めない…という風になっているようです。  生成されたファイルのオーナーもApacheになっていました。  いろいろありがとうございます。

関連するQ&A