Zkus si nasimulovat opacnou situaci. Mas chat s mnoha uzivateli online. Co se stane, kdyz tam locky nedas?
Zapis do souboru nejakou dobu trva. Php preda funkci zapis parametry a dal si dela svoje. Pokud dva uzivatele pres php provedou fwrite a ten druhy se trefi zrovna do okamziku, kdy ten jeden jeste neudelal fclose. Php mu to dovoli a cele se to znici, nuluje velikost souboru. Pro takovy pripad se vymysleli flock, ktery druhemu uzivateli blokuje pristup ke zmene obsahu, kdyz s nim pracuje jiny uzivatel. Pred db jsem pouzival tento kod
function writeFile($file_name,$data_to_save,$end_time,$type='w')
{
global $ERRORS;
$fp = fopen($file_name,$type);
if ($fp)
{
$start_time = microtime();
do {
$can_write = flock($fp, LOCK_EX);
if (!$can_write)
{usleep(round(rand(0,100)*1000));}
}
while ((!$can_write) and ((microtime() - $start_time) < $end_time));
if ($can_write)
{fputs($fp,$data_to_save);}
else {$ERRORS[] = 'writeFile: file write error!'; return false;}
@chmod($file_name,0755); //!nastavit prava k zapisu souboru, 755 (rwx r.x r.x) nebo 644 (rw. r.. r..) (owner-vlastnik, group-skupina, other-ostatni, r-read, w-write, x-execute; umask, mkdir)
fclose($fp);
}
else {$ERRORS[] = 'writeFile: file open error!'; return false;}
return true;
}
U db muze nastat neco podobneho. Tam jsou zamky take. Ale u db se vykonavaji prikazy postupne a ne najednou, jak to umoznuje server/php. Samozrejme, kdy dva lide edituji jeden zaznam, tak se prepise udaji, ktere poslal posleni z nich. Ale nezkolabuje kvuli tomu soubor s databazi, jak se to stane u fwrite bez flocku.