flockが有効に使われていない

メッセージ

file.phpのfile_write関数などいくつかの関数でflockが有効に使われていません。正しい使い方にした方がよいかと思います。

現状:

$fp = fopen($file,'w')
        or die_message(/* エラーメッセージ */);
flock($fp,LOCK_EX);
fputs($fp,$str);
flock($fp,LOCK_UN);
fclose($fp);

改善案:

$fp = fopen($file,file_exists($file)?'r+':'w')
        or die_message(/* エラーメッセージ */);
flock($fp,LOCK_EX);
rewind($fp);
fputs($fp,$str);
ftruncate($fp,ftell($fp));
fflush($fp);
flock($fp,LOCK_UN);
fclose($fp);

参考:


ソースを見ると、

$oldpagesrc = join('',get_source($post['page']));
$oldpagemd5 = md5($oldpagesrc);
	
if ($oldpagemd5 != $post['digest']) {
  /* 衝突発生 */
}
else {
  /* 書き込み */
}

という流れだったので、

md5(X(起点文書))とmd5(X(現文書))の比較
Yを書き込み
md5(X(起点文書))とmd5(Y(現文書))の比較
衝突

となるところが、

md5(X(起点文書))とmd5(X(現文書))の比較
md5(X(起点文書))とmd5(X(現文書))の比較
Yを書き込み
Zを書き込み

となるタイミングが生じるのではないかと考えました。。あ、get_sourceにflockのチェックをいれればいいのかな。衝突チェックから書き込みまでロックし続けないと意味ないか。 --hirofummy 2003-08-24 (日) 17:42:19


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2003-08-25 (月) 09:29:05
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.315 sec.

OSDN