fopenをするための最良の方法

無題

とりあえず下記にユーザ関数を。

<?php

function fopen_read($filepath){
	$fp = @fopen($filepath, 'rb');
	if(!$fp){
		return false;
	}
	flock($fp, LOCK_SH);
	return $fp;
}

function fopen_write($filepath){
	$fp = @fopen($filepath, 'a+b');
	if(!$fp){
		return false;
	}
	ftruncate($fp, 0);
	if(!flock_ex($fp)){
		return false;
	}
	rewind($fp);
	return $fp;
}

/*
function fopen_write($filepath){
	$fp = @fopen($filepath, 'w+b');
	if(!$fp){
		return false;
	}
	if(!flock_ex($fp)){
		return false;
	}
	//fseek($fp, 0, SEEK_SET);
	rewind($fp);
	return $fp;
}
*/

function fopen_add($filepath){
	$fp = @fopen($filepath, 'a+b');
	if(!$fp){
		return false;
	}
	if(!flock_ex($fp)){
		return false;
	}
	fseek($fp, 0, SEEK_END);
	return $fp;
}

function flock_ex($fp){
	if(!is_resource($fp)) return false;
	$retries = 0;
	$max_retries = 100;
	
	do{
		if($retries > 0){ 
			usleep(rand(1, 10000)); 
		} 
		$retries += 1; 
	}while(!flock($fp, LOCK_EX) and $retries <= $max_retries);
	
	if($retries == $max_retries){
		return false; 
	}
	
	return false;
}

?>
参考:http://testwiki.仮.jp/index.php?PHP%2F%A5%D5%A5%A1%A5%A4%A5%EB%A5%ED%A5%C3%A5%AF%2F%C0%DF%B7%D7
http://www.php.net/manual/ja/function.flock.php