BugTrack/2098
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* flockが不徹底 [#wfdb9ebc]
- 元タイトル: flock処理が不完全
-ページ: [[BugTrack2]]
-投稿者: [[Cue]]
-優先順位: 重要
-状態: 提案
-カテゴリー: 本体バグ
-投稿日: 2005-07-30 (土) 19:43:50
-バージョン:
**メッセージ [#jc559974]
影響範囲を調べきれていませんが、get_source等でflock処理が...
----
-関連:[[BugTrack/164]] -- [[Ratbeta]] &new{2005-07-30 (土...
--164の場合はflockをサポートしないファイルシステム等でど...
-こんにちは :) flock() に関するご指摘は技術的に正確だと思...
-- PHPのfile()関数は内部でflock(LOCK_SH)などを行いません...
-- その一方でPukiWikiは基本的に書き込みよりも読み取りの比...
-- この問題の根本は、PukiWikiのソースについて今まで統一的...
--- flock() の有無と使い方に関する私の見解は: [[BugTrack2...
-- flock(LOCK_SH) を追加しました。[[cvs:lib/file.php]] (1...
-- [[cvs:lib/file.php]] (1.34) lock中にget_source() した...
--- 既存のコードを念のため見回りましたが、get_source() を...
-とりあえず 1.4.6 向けの修正はここまでとさせていただきま...
- 関連: [[BugTrack2/306]] -- &new{2009-08-13 (木) 14:28:...
- [[official:質問箱3/260]] -- &new{2010-10-24 (日) 12:29...
#comment
** fopen(w) と flock(LOCK_EX) [#qc64c750]
-対応おつかれさまです。172行file_write中のfopen($file, 'w...
-かゆい所のお知らせありがとうございます :) 誰かが空の文書...
-[[cvs:lib/file.php]] (1.35-1.37) こんなところでしょうか...
-1.4.6向けにはここまでとさせていただきます。他にも類似の...
#comment
** その他: flock() を行うラッパーを使う案 [#a861ca24]
-grepするとプラグインも含めてかなりの修正個所がありそうな...
function fopen_w_lock($filename, $mode, $use_include_pat...
{
$mode = str_replace('b', '', $mode);
$fp = @fopen($filename, 'a+b', $use_include_path);
if($fp !== FALSE){
switch($mode){
case 'r':
flock($fp, LOCK_SH);
rewind($fp);
break;
case 'r+':
flock($fp, LOCK_EX);
rewind($fp);
break;
case 'w':
case 'w+':
flock($fp, LOCK_EX);
ftruncate($fp, 0);
break;
case 'a':
case 'a+':
flock($fp, LOCK_EX);
fseek($fp, SEEK_END);
}
}
return $fp;
}
function fclose_w_lock(&$fp)
{
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}
function file_w_lock($filename, $use_include_path = FALSE)
{
$fp = &fopen_w_lock($filename, 'r', $use_include_path);
if($fp === FALSE)
return FALSE;
$ary = file($filename, $use_include_path);
fclose_w_lock($fp);
return $ary;
}
-興味深いアイデアですね :) しかし「flock()を使っていない ...
-PHP >= 4.3.2限定なら stream_wrapper_register が使えるか...
-- こちらは file() などが内部で stream を呼び出す様になっ...
-えっと、検索対象にしたのはfopen,gzopen,fileで一応タグジ...
-- なるほど、gzopenということはbackup、そしてdiffなどのメ...
--flockは気にしないのなら中途半端に対策するより放置した方...
---気になるのでflockだけ。処理が特殊なので穴があるかもし...
--- backup.php Sat Apr 30 14:21:00 2005
+++ backup.lock.php Sun Aug 21 18:56:52 2005
@@ -65,12 +65,32 @@
$body = PKWK_SPLITTER . ' ' . get_filetime($page) . "...
$body = preg_replace("/\n*$/", "\n", $body);
- $fp = _backup_fopen($page, 'wb')
- or die_message('cannot write file ' . htmlspecialcha...
- '<br />maybe permission is not writable or filename ...
- _backup_fputs($fp, $strout);
- _backup_fputs($fp, $body);
- _backup_fclose($fp);
+ $filename = _backup_get_filename($page);
+ do{
+ if(($lock = @fopen($filename, 'r')) !== FALSE){
+ flock($lock, LOCK_EX);
+ clearstatcache();
+ if(_backup_get_filetime($page) != $lastmod)
+ break;
+ }else{
+ $lock = @fopen($filename, 'a+')
+ or die_message('cannot write file ' . htmlspecialc...
+ '<br />maybe permission is not writable or filenam...
+ flock($lock, LOCK_EX);
+ // $strout = ''; // 処理中に管理者がファイルを消し...
+ clearstatcache();
+ if(filesize($filename) != 0)
+ break;
+ }
+ $fp = _backup_fopen($page, 'wb')
+ or die_message('cannot write file ' . htmlspecialch...
+ '<br />maybe permission is not writable or filename...
+ _backup_fputs($fp, $strout);
+ _backup_fputs($fp, $body);
+ _backup_fclose($fp);
+ }while(FALSE);
+ flock($lock, LOCK_UN);
+ fclose($lock);
}
}
@@ -230,9 +250,15 @@
*/
function _backup_file($page)
{
- return _backup_file_exists($page) ?
- gzfile(_backup_get_filename($page)) :
- array();
+ $filename = _backup_get_filename($page);
+ $data = array();
+ if(($fp = @fopen($filename, 'r')) !== FALSE){
+ flock($fp, LOCK_SH);
+ $data = gzfile($filename);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+ return $data !== FALSE ? $data : array();
}
}
/////////////////////////////////////////////////
@@ -296,9 +322,15 @@
*/
function _backup_file($page)
{
- return _backup_file_exists($page) ?
- file(_backup_get_filename($page)) :
- array();
+ $filename = _backup_get_filename($page);
+ $data = array();
+ if(($fp = @fopen($filename, 'r')) !== FALSE){
+ flock($fp, LOCK_SH);
+ $data = file($filename);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+ return $data !== FALSE ? $data : array();
}
}
?>
#comment
終了行:
* flockが不徹底 [#wfdb9ebc]
- 元タイトル: flock処理が不完全
-ページ: [[BugTrack2]]
-投稿者: [[Cue]]
-優先順位: 重要
-状態: 提案
-カテゴリー: 本体バグ
-投稿日: 2005-07-30 (土) 19:43:50
-バージョン:
**メッセージ [#jc559974]
影響範囲を調べきれていませんが、get_source等でflock処理が...
----
-関連:[[BugTrack/164]] -- [[Ratbeta]] &new{2005-07-30 (土...
--164の場合はflockをサポートしないファイルシステム等でど...
-こんにちは :) flock() に関するご指摘は技術的に正確だと思...
-- PHPのfile()関数は内部でflock(LOCK_SH)などを行いません...
-- その一方でPukiWikiは基本的に書き込みよりも読み取りの比...
-- この問題の根本は、PukiWikiのソースについて今まで統一的...
--- flock() の有無と使い方に関する私の見解は: [[BugTrack2...
-- flock(LOCK_SH) を追加しました。[[cvs:lib/file.php]] (1...
-- [[cvs:lib/file.php]] (1.34) lock中にget_source() した...
--- 既存のコードを念のため見回りましたが、get_source() を...
-とりあえず 1.4.6 向けの修正はここまでとさせていただきま...
- 関連: [[BugTrack2/306]] -- &new{2009-08-13 (木) 14:28:...
- [[official:質問箱3/260]] -- &new{2010-10-24 (日) 12:29...
#comment
** fopen(w) と flock(LOCK_EX) [#qc64c750]
-対応おつかれさまです。172行file_write中のfopen($file, 'w...
-かゆい所のお知らせありがとうございます :) 誰かが空の文書...
-[[cvs:lib/file.php]] (1.35-1.37) こんなところでしょうか...
-1.4.6向けにはここまでとさせていただきます。他にも類似の...
#comment
** その他: flock() を行うラッパーを使う案 [#a861ca24]
-grepするとプラグインも含めてかなりの修正個所がありそうな...
function fopen_w_lock($filename, $mode, $use_include_pat...
{
$mode = str_replace('b', '', $mode);
$fp = @fopen($filename, 'a+b', $use_include_path);
if($fp !== FALSE){
switch($mode){
case 'r':
flock($fp, LOCK_SH);
rewind($fp);
break;
case 'r+':
flock($fp, LOCK_EX);
rewind($fp);
break;
case 'w':
case 'w+':
flock($fp, LOCK_EX);
ftruncate($fp, 0);
break;
case 'a':
case 'a+':
flock($fp, LOCK_EX);
fseek($fp, SEEK_END);
}
}
return $fp;
}
function fclose_w_lock(&$fp)
{
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}
function file_w_lock($filename, $use_include_path = FALSE)
{
$fp = &fopen_w_lock($filename, 'r', $use_include_path);
if($fp === FALSE)
return FALSE;
$ary = file($filename, $use_include_path);
fclose_w_lock($fp);
return $ary;
}
-興味深いアイデアですね :) しかし「flock()を使っていない ...
-PHP >= 4.3.2限定なら stream_wrapper_register が使えるか...
-- こちらは file() などが内部で stream を呼び出す様になっ...
-えっと、検索対象にしたのはfopen,gzopen,fileで一応タグジ...
-- なるほど、gzopenということはbackup、そしてdiffなどのメ...
--flockは気にしないのなら中途半端に対策するより放置した方...
---気になるのでflockだけ。処理が特殊なので穴があるかもし...
--- backup.php Sat Apr 30 14:21:00 2005
+++ backup.lock.php Sun Aug 21 18:56:52 2005
@@ -65,12 +65,32 @@
$body = PKWK_SPLITTER . ' ' . get_filetime($page) . "...
$body = preg_replace("/\n*$/", "\n", $body);
- $fp = _backup_fopen($page, 'wb')
- or die_message('cannot write file ' . htmlspecialcha...
- '<br />maybe permission is not writable or filename ...
- _backup_fputs($fp, $strout);
- _backup_fputs($fp, $body);
- _backup_fclose($fp);
+ $filename = _backup_get_filename($page);
+ do{
+ if(($lock = @fopen($filename, 'r')) !== FALSE){
+ flock($lock, LOCK_EX);
+ clearstatcache();
+ if(_backup_get_filetime($page) != $lastmod)
+ break;
+ }else{
+ $lock = @fopen($filename, 'a+')
+ or die_message('cannot write file ' . htmlspecialc...
+ '<br />maybe permission is not writable or filenam...
+ flock($lock, LOCK_EX);
+ // $strout = ''; // 処理中に管理者がファイルを消し...
+ clearstatcache();
+ if(filesize($filename) != 0)
+ break;
+ }
+ $fp = _backup_fopen($page, 'wb')
+ or die_message('cannot write file ' . htmlspecialch...
+ '<br />maybe permission is not writable or filename...
+ _backup_fputs($fp, $strout);
+ _backup_fputs($fp, $body);
+ _backup_fclose($fp);
+ }while(FALSE);
+ flock($lock, LOCK_UN);
+ fclose($lock);
}
}
@@ -230,9 +250,15 @@
*/
function _backup_file($page)
{
- return _backup_file_exists($page) ?
- gzfile(_backup_get_filename($page)) :
- array();
+ $filename = _backup_get_filename($page);
+ $data = array();
+ if(($fp = @fopen($filename, 'r')) !== FALSE){
+ flock($fp, LOCK_SH);
+ $data = gzfile($filename);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+ return $data !== FALSE ? $data : array();
}
}
/////////////////////////////////////////////////
@@ -296,9 +322,15 @@
*/
function _backup_file($page)
{
- return _backup_file_exists($page) ?
- file(_backup_get_filename($page)) :
- array();
+ $filename = _backup_get_filename($page);
+ $data = array();
+ if(($fp = @fopen($filename, 'r')) !== FALSE){
+ flock($fp, LOCK_SH);
+ $data = file($filename);
+ flock($fp, LOCK_UN);
+ fclose($fp);
+ }
+ return $data !== FALSE ? $data : array();
}
}
?>
#comment
ページ名: