PHP4.1でファイル読み込みできない

このQ&Aのポイント
  • $data_fileを使用してファイルを読み込んでいるが、PHP4.1の環境ではページが正しく表示されない
  • file関数では問題なくファイルを読み込めるが、filelockされないためデータの破壊が起こる可能性がある
  • php.iniなどで回避策を見つけられるかどうかを確認したい
回答を見る
  • ベストアンサー

PHP4.1でファイル読み込みできない

次のような方法でファイルの読み込みをしていますが、4.1の環境だと右上の地球アイコンが回りっぱなしでページが表示されなくなります。 $fo=@fopen($data_file,"r") or err("データファイルを読み込めません"); flock($fo, LOCK_EX); $i=0; while(!feof($fo)){ $text_buff=fgets($fo); if(trim($text_buff)){ $buff[$i]=$text_buff; } $i++; } flock($fo, LOCK_UN); fclose($fo); file関数で読み込んだら問題なかったので、現在はfile関数を使っていますが、どのコマンドが問題なのかわかりません。 file関数だとfilelockされないので、同時アクセスされた場合データの破壊があると聞いておりますのでできればfopenで処理したいと考えています。 php.iniなどで回避可能なのでしょうか。 よろしくお願いいたします。

  • umioyo
  • お礼率78% (172/220)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

詳しく調べて無いですが、!feof($fo)が問題だと思います。 while($text_buff=fgets($fo)){ if(trim($text_buff)){ $buff[$i]=$text_buff; } $i++; } で動くんじゃないでしょうか。

umioyo
質問者

お礼

ありがとうございました。 客先の環境なので客先で確認して結果をまた報告させて頂きます。 取り急ぎ御礼まで。

関連するQ&A

  • ファイルにデータを書き込むときにもとのデータを消去

    データを1個のファイルに保存しているのですが、データを更新するときに現在書き込まれている中身を一度消去してから書き込みたいのですが、どのような方法がいいのでしょうか。 $fo=@fopen($book,"r+") or die(); flock($fo, LOCK_EX); ~読み込んで書き込み用のデータ処理~ fseek($fo, 0); fwrite($fo, $buff); flock($fo, LOCK_UN); fclose($fo); と、していますが、先頭に追加されるだけで、これまでのデータが残ったままです。 一度ファイルをまっさらにするか、一度ファイルを削除して新規に作成しようかとも思いましたが、アクセス数が多くなる予定なので、あまり良い方法ではないと考えています。 このような場合、一般的にどうすればいいかご教授願えればと思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP、外部ファイルにテキストを書きだす。

    こんにちは、皆様。 下記のソースを実行したいと思います。期待する結果としては、外部ファイルに行列に書き出すことです。 <?php $count_file="count.dat"; if(file_exists($count_file)){ $file = fopen("count.dat", "a") or die("file can not open"); $order_no = fgets($file) + time(); print $order_no; }else{ $file = fopen($count_file, "w") or die("file can not open"); $order_no = time(); } set_file_buffer($file,0); flock($file, LOCK_EX); fputs($file , $order_no); flock($file, LOCK_UN); fclose($file); ?> このソースの結果は配列として書き込まれてました。こんな感じです。 129835261512983526501298355377129835537912983566121298356635 このソースを実行する度にcount.datファイルに順次書き出したと思います。 1298352615 1298352650 1298355377 1298355379 1298356612 1298356635 まだまだPHP勉強中なのでわかる方教えてください。 (1)この行で$order_no = fgets($file) + time(); 改行記号をどう付ければ良いでしょうか? (2) C言語のようにポインターで指定しなければならないですか?書き方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイルを開いたままオープンモードを変更したい

    $fp = fopen ($file, "r"); flock ($fp, 2); で開いたファイルをロックを解除しないままファイルを空にして書き込みモードに移行する方法を教えてください。 或いは $fp = fopen ($file, "r+"); flock ($fp, 2); からfputs()で書き込んだ後にファイルのファイルポインタ以降の部分を切り捨てる形でも良いです。 flock ($fp, 2);の後にfgetsによりファイル内容を取得した後ファイルロックをしたままファイルの余計な部分を捨てたいので $fp = fopen ($file, "w"); flock ($fp, 2); や $fp = fopen ($file, "r"); flock ($fp, 2); fgets ($fp); flock ($fp, 3); fclose ($fp); $fp = fopen ($file, "w"); flock ($fp, 2); は必要ありません。

    • ベストアンサー
    • PHP
  • ファイルの読み書きでエラー

    下記のようなプログラムでファイルからデータを読み、 データを加工して、ファイルに書き込んでいます。 しかし、頻繁にアクセスがあると、読み出しのエラーや ファイルの中身が消えてしまう症状も発生します。 (ファイルの中身が消えるのは読み出し時にデータが 読めないからかも知れません) エラーをなくす為にはどうしたら良いのでしょうか? 教えて下さい。 $cmdata = file($cmfile); //ファイルからデータを読む  ・  ・(データの加工)  ・ $fp = @fopen($cmfile,"w+"); flock($fp,LOCK_EX); for( $i=0; $i<count($cmdata); $i++ ) { fputs($fp, $cmdata[$i]); } //ファイルにデータを書く flock($fp,LOCK_UN); fclose($fp);

    • 締切済み
    • PHP
  • fopenとfile_put_contents

    ファイルを操作する関数「fopen」と「file_put_contents」を勉強していて 不思議に思いました。 「fopen」を使ったファイルに書き出す場合 「fopen」→「flock(LOCK_EX)」→「fputs」→「flock(ロック解除)」→「fclose」の 流れが必須になるようですが 「file_put_contents(FILE_APPEND | LOCK_EX)」の場合、 この関数一つで同じような処理されるようですが ロックやロックの解除、書き込んだファイルを閉じるなどの 役割がすべて補われるのでしょうか? 「file_get_contents」も同じだような役割りのようで 手間をかけて複雑になってしまう「fopen」を使う理由は あるのでしょうか? 処理工程など多少の違いの説明は読んでみたのですが 複雑になる「fopen」を使う必要性が分かりません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • PHPのリロード時の処理

    PHPのリロード時の処理 PHPプログラム初心者です。 掲示板のプログラムを作成しております。 以下のコードで、リロード時、自動で投稿ボタンが押されてsubmitしてしまいます。 自分で考えた解決策としては、下記のwriteDate()内で、条件を入れることです。 $_GET['personal_name'];のデータを変数に保持し、次にリロードされた時同じものが返ってきら、writeDate()内の処理をしないという方法です。 このときの変数の保存の仕方が解りません。 ご存じの方がおられましたら教えてください。 <?php if($_SERVER["REQUEST_METHOD"]=="GET"){ writeData(); } readData(); function readData(){ $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'rb'); if($fp){ if(flock($fp,LOCK_SH)){ while(!feof($fp)){ $buffer=fgets($fp); print($buffer); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } function writeData(){ //--------ここで同じ書き込みデータがあればreturnしたい。------- $t=$_GET['personal_name']; $personal_name=$_GET['personal_name']; $contents=$_GET['contents']; $contents=nl2br($contents); $data="<hr>\r\n"; $data=$data."<p>[投稿者:".$personal_name."]</p>"; $data=$data."[内容]"; $data=$data."<p>".$contents."</p>"; $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'ab'); if($fp){ if(flock($fp,LOCK_EX)){ if(fwrite($fp,$data)===FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } $data=null; fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • 新規でファイルを作成したい

     お世話になっております。  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でも必要なのでしょうか?  もし足りない点、または初心者が陥りやすい点を指摘していただけるとありがたいです。

    • ベストアンサー
    • PHP
  • file関数とファイルポインタ

    ファイルの内容を(書き換えるために一旦)読み込む時に、 fgets関数と違ってfile関数は fopen関数を使わなくても済む、ということで 便利なので使ってみようと思っているのですが、 ちょっと躓いています。 set_file_bufferやflock、rewindが必要なのですが、 これらはどれも引数にファイルポインタを使います。 fopen関数を使っていないのでコレがないのですが、 どうすればいいのでしょうか? fopenのあとにfileを使う? fopenを使わなくても閉じる時にはfcloseが必要? でもfcloseもファイルポインタを使うし… よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpで引き算が上手くいかない

    データの引き算で書き出す際に予期しない数字になってしまって 困っております。 data.datに10となっていた際に、下記のコードを実行すると90になってします。本当は9にしたいのですが、どこに原因があるのかわからずにおります。 どなたかご教授ください。 宜しくお願いいたします。 $fp = fopen("data.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count != "0"){ $registry_count--; } flock($fp,LOCK_EX); fseek($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP