BugTrack/448
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*flockが有効に使われていない [#v0963d17]
-ページ: BugTrack
-投稿者: [[hirofummy]]
-優先順位: 普通
-状態: 完了
-カテゴリー: 本体バグ
-投稿日: 2003-08-24 (日) 14:29:58
-バージョン: 1.4rc4
**メッセージ [#n2e193c6]
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);
参考:
-http://itbtech.itboost.co.jp/php/php_04.php
----
-要件は、'w' であって、'r+' じゃない。にも関わらず、rewin...
-質問の意味がよく分からないのですが、[[これ>http://www98....
-あれ、私がひょっとして変な勘違いしてるかな… -- [[hirofum...
-fopen が2個ある場合と、1個の場合とは、全く異なるので、...
-あと、fflush じゃあてにならないから、明示的に ftruncate ...
-更新の衝突の検出絡みで不具合が出るかなと考えたのですがそ...
--いやぁ、全く意味がない?ということも無いと思いますよ。...
-私の案はr+の場合を考えていただけでupkさんのおっしゃるよ...
-正しい改善案?はfile_writeの中に更新の検出を組み込む感じ...
--更新の検出を組み込むというメリットは、更新の衝突を気に...
-更新の衝突が検出できないパターンがあるかと思いまして。 -...
ソースを見ると、
$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(), $digestを計算するのがconvert...
//#comment
終了行:
*flockが有効に使われていない [#v0963d17]
-ページ: BugTrack
-投稿者: [[hirofummy]]
-優先順位: 普通
-状態: 完了
-カテゴリー: 本体バグ
-投稿日: 2003-08-24 (日) 14:29:58
-バージョン: 1.4rc4
**メッセージ [#n2e193c6]
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);
参考:
-http://itbtech.itboost.co.jp/php/php_04.php
----
-要件は、'w' であって、'r+' じゃない。にも関わらず、rewin...
-質問の意味がよく分からないのですが、[[これ>http://www98....
-あれ、私がひょっとして変な勘違いしてるかな… -- [[hirofum...
-fopen が2個ある場合と、1個の場合とは、全く異なるので、...
-あと、fflush じゃあてにならないから、明示的に ftruncate ...
-更新の衝突の検出絡みで不具合が出るかなと考えたのですがそ...
--いやぁ、全く意味がない?ということも無いと思いますよ。...
-私の案はr+の場合を考えていただけでupkさんのおっしゃるよ...
-正しい改善案?はfile_writeの中に更新の検出を組み込む感じ...
--更新の検出を組み込むというメリットは、更新の衝突を気に...
-更新の衝突が検出できないパターンがあるかと思いまして。 -...
ソースを見ると、
$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(), $digestを計算するのがconvert...
//#comment
ページ名: