PHPのfgetcsvやfputcsvでファイルを扱う時の排他処理(その2)

前回からの続き...

色々調べたり、人生初のトラックバックを頂戴したりして、浮かれたり混乱したりしながらの自分なりの結論。

  • stream_set_write_buffer()はPHP 4.3.2 RC2以降からは使えない。だからもう使わない。
  • ロック用にファイルを生成する場合は存在チェックとファイル生成の間に割り込まれるので×。
  • ロック用にmkdirを使えば、存在チェックとファイル生成を1ステップで作成できるので◎。
  • flocseの前にflockするのは駄目。そもそもflockは使わないことにする。


排他処理にmkdirを使用する場合のソース
ロック&ロック解除の関数は人様のブログ(※)を参考にほぼコピペ。
※)URLブックマークし忘れた!!見つけ次第載せます<(_ _)>

<?php
$file = "hoge.csv";
$data = array(
	array( "1", "hoge", "hogegege..." ),
	array( "2", "fuga", "gugagaga..." ),
	array( "3", "piyo", "piyoyoyo..." ),
);

if( file_lock( $file )
{
	$fp = fopen( $file , 'w' );
	foreach( $data as $row )
	{
		fputcsv( $fp, $row );
	}
	fclose( $fp );
	file_unlock( $file );
}

// ファイルロックチェック&生成
function file_lock( $file )
{
	$lock = $file . ".lock"; // ロック用ディレクトリ名	
    $count = 5;	// 再トライする回数
	$time = 60;	// ロックディレクトリの有効期限

	for( ; $count > 0; $count-- )
	{
        if( ! @mkdir( $lock, 0777 ) )
        {
            sleep( 1 );
        }
        else
        {
            break;
        }
	}
	
    if( ! $count )
    {
        if( filemtime( $lock ) <= time() - $time )
        {
			if( file_unlock( $file ) && file_lock( $file ) )
			{
				return true;
			}
		}
		return false;
	}
	return true;
}

// ファイルロック解除
function file_unlock( $file )
{
    if( @rmdir( $file . ".lock" ) ) return true;
    return false;
}
?>

こんな感じかな....
再トライの回数とロックディレクトリの有効期限は適切なのかよくわからんw
とりあえず次はfputcsvが失敗した場合の処理かな。
実はもっと大きな心配事があるけどとりあえず....

続く