Tom: Locking aua

Beitrag lesen

Hello,

Ein sehr schönes Klickscript mit Statistikfunktion findest Du hier:

Dieses Script ist tatsächlich sehr schön daneben...

if($fd = fopen($LOG_FILE_PATH,  "r+")) {
 //lock access
 flock($fd, 1);

##+ Locking wartet bis zum Erfolg oder Timeout des Scripts

//get the entire file contents
 while(!feof($fd)) {
  $data .= fgets($fd, 8000);
   }
 $QS2 = preg_replace("|?|", "?", $QS);
 //echo $QS . "<br>" . $QS2;
 if(preg_match("|<tr><td class="DataTD"><a href="$QS2">$QS2</a></td><td class="DataTD">(.*)</td></tr>\n|", $data, $matches)){
  //we are already tracking this one
  $count = $matches[1];
  $count++;
  $CountReplacementStr = "<tr><td class="DataTD"><a href="$QS">$QS</a></td><td class="DataTD">" . $count . "</td></tr>\n";
  $data = preg_replace("|<tr><td class="DataTD"><a href="$QS2">$QS2</a></td><td class="DataTD">.*</td></tr>\n|", $CountReplacementStr , $data);
  }
 else{
  $data = preg_replace("|<!--INSERT_NEW_LOGS_HERE-->|", "<!--INSERT_NEW_LOGS_HERE-->\n<tr><td class="DataTD"><a href="$QS">$QS</a></td><td class="DataTD">1</td></tr>\n", $data);
  }
 fclose($fd);

##+ Handle wird hier zurückgegeben, damit erlischt auch das Lock

$fd = @fopen($LOG_FILE_PATH,  "w+");

##+ hier wird ein neues Handle angefordert, aber keine Fehlerkontrolle durchgeführt und auch
##+ kein neues Lock angefordert und geprüft
##+ das ergibt eine typische Kontroll-Lücke oder auch "Race Condition"
##+ weitere Bemerkungen vorbehalten

fputs($fd, $data);
 fflush($fd);
 flock($fd, 3);
 fclose($fd);

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau