以下のメソッドを使用して、ファイルの書き込みをしたいのですが、

PHPで同時書き込みを制限したり、
ファイルが壊れないように、
さらに書き込みデータ等が正常に来ない場合はエラーに
するなどの制限をしたいです。
DBに格納するような感じで、ファイルにデータを書き込みたいです。
PHPでもっときちんと出来るのでしょうか?
自分のスキルでは以下のソースが限界です。
他に知っている方がいましたら教えて下さい。

function test_wirte($data){
define("CSVFILE_CAMP","/test/list.csv");
$file_csv = CSVFILE_CAMP;
//ファイルオープン
if(!($fno = fopen("$file_csv","a+"))){
return -1;
}

//ファイルロック
flock($fno,LOCK_EX);
//現在日付の取得
$bbbb = $data['bbbb'];
$aaaa = $data['aaaa'];
$strDate = date("y-m-d H:i:s");
$str_file = "";
$str_file .= "$strDate";
$str_file .= "\t";
$str_file .= "$bbbb";
$str_file .= "\t";
$str_file .= "$aaaa";
$str_file .= "\t";
$str_file .= "\n";
//ファイル書き込み
fwrite($fno, $str_file);
//ファイルアンロック
flock($fno,LOCK_UN);
//ファイルクローズ
fclose($fno);
return 0;
}

回答の条件
  • 1人5回まで
  • 登録:2006/09/04 19:57:43
  • 終了:2006/09/05 14:26:08

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/09/04 20:54:22

ポイント23pt

http://jp.php.net/manual/ja/function.fclose.php

書き込みできたかの確認には fclose の返り値もチェックしましょう。

ただ、出来ればこのような制御はDBに任せたいところですね。

SQL に抵抗が無ければ、SQLite 等がオススメです。

ファイルベースなのでサーバーを立てる必要がありません。

id:hopefully

件数が多くなると思うので

SQLiteはちょっと無理そうですね。

でもありがとうございます。

2006/09/05 10:44:27
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402006/09/04 20:50:37

ポイント23pt

http://jp.php.net/manual/ja/function.flock.php

CGI 等でもファイルの書き込み制御等は話題になりますが、

結局のところ flock が唯一最善の解になります。

このため方法としては提示のとうりでよいと思いますが

、1点だけ。

flock($fno,LOCK_EX);

flock 関数は flock の成否が返り値となっていますので、

必ずチェックするようにしましょう。

でないとロックを取得できていないのに書き込む可能性があります。

id:hopefully

ありがとうございます。

2006/09/05 10:45:00
id:yoshi_12 No.3

yoshi_12回答回数18ベストアンサー獲得回数22006/09/04 22:00:31

ポイント22pt

fcloseの前にLOCK_UNでロックを外した場合は、バッファの関係で不完全なファイル内容を読み込まれる場合があり、危険です。


詳細は下記URL

http://testwiki.xn--xnq.jp/?PHP%2F%A5%D5%A5%A1%A5%A4%A5%EB%A...


上記の点について、私の場合の解決策は

必ずfflushし、LOCK_UNでロックを外す事はせず、fcloseでロックを外すようにしてます。

id:hopefully

これなんですが、

//ファイルアンロック

flock($fno,LOCK_UN);

//ファイルクローズ

fclose($fno);

の部分を

//ファイルアンロック

fflush($fno);

//ファイルクローズ

fclose($fno);

に変更するのでいいのでしょうか?

2006/09/05 10:49:37
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402006/09/05 11:12:54

ポイント22pt

なんか余談を膨らませてしまって恐縮ですが、件数が多いならなおのこと SQLite の方がいいですよ。

http://journal.mycom.co.jp/special/2004/php5/006.html

数万件程度のオーダーであれば、MySQL より高速です。

id:hopefully

でもですね、ちょっとDB系は使用出来ないんですよ。

結構な制限があるので。

2006/09/05 11:21:51
  • id:yoshi_12
    >これなんですが、
    >
    >//ファイルアンロック
    >
    >flock($fno,LOCK_UN);
    >
    >//ファイルクローズ
    >
    >fclose($fno);
    >
    >の部分を
    >
    >//ファイルアンロック
    >
    >fflush($fno);
    >
    >//ファイルクローズ
    >
    >fclose($fno);
    >
    >に変更するのでいいのでしょうか?


    はい。OKです。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません