salve, mi servirebbe una illuminazione riguardo la gestione dell'atomicità durante una procedura di caching

lo script realizzato fin ora per determinare se fare il cache o no è questo :
codice:
<?
	// controlla se c'è da fare o no il cache, main_check è 0 se è necessario farlo
	$update=mysql_query("UPDATE forum SET main_check='1' WHERE main_check='0'",$mydb);
	// se ha modificato il record (in maniera atomica nel db) il primo utente che arriva crea file di cache, gli altri saltano questo if e lo includeranno semplicemente
	if(mysql_affected_rows()!=0) {
		ob_start();			
        	// creo la pagina che andrà inclusa successivamente
		$query=mysql_query("SELECT c_check, c_id FROM categories",$mydb);
		while ($row = mysql_fetch_array($query, MYSQL_NUM)) {
		?>
			Category <?=$row[1]?>

		<?
		}
		$cachefile="./cache/list.php";
		$fp=fopen($cachefile, 'w'); 
		fwrite($fp, ob_get_contents());
		fclose($fp);
		
		ob_end_clean();									
	}
	
	// includo la pagina (appena creata, oppure se non ha aggiornato nulla quella che già c'era
	include("./cache/list.php");
?>
ed è sulla ultima riga il problema : per il discorso atomicità questo script non funziona.
se per caso uno stà leggendo il file nella cartella cache, ma nel frattempo qualcuno modifica qualcosa e un ulteriore utente si collega alla pagina, rischio di far leggere a uno il file mentre l'altro lo stà scrivendo. stessa cosa se prima uno inizia a scrivere il file e un altro, evitando il primo if, inizia a leggere quel file.

l'unico modo che mi è venuto in mente è utilizzare i semafori, ma da quanto ne sò (forse poco) su php non sono il massimo.

qualcuno ha qualche soluzione magari migliore?

cordiali saluti