[php] Transactions met een filelock?

Pagina: 1
Acties:

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Voor een projectje waar ik mee bezig ben, heb ik voor een adminpagina een transactie nodig, want als er twee admins tegelijk bezig zijn (is niet onwaarschijnlijk) loop ik het risico van gegevensverlies.
Nu dacht ik aan de volgende code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
// mysql initialisatie.
$query = "SELECT ... FROM tabel WHERE ...";
$fp=fopen("../locks/admin.lock",'a+');
if(flock($fp,LOCK_EX,true)) {
  ftruncate($fp);
  fwrite($fp,"$username;");
  $result = mysql_query($query);
  $data = mysql_result($result,0,0);
  $data = mysql_escape_string(IetsIngewikkelds($data));
  $query = "UPDATE tabel SET data = '$data'";
  mysql_query($query);
  flock($fp,LOCK_UN,true);
} else {
  $user = fgetcsv($fp,40,";");
  die('was locked by '. $user[0]);
}
?>

Ik heb het nog niet geprobeerd, maar gaat de bovenstaande code werken, en wat zijn de bijwerkingen van dit soort locks? Momenteel wil ik dit toepassen in een adminpagina die eenmaal per dag wordt bekeken. Wat zijn de gevolgen voor de performance als ik zoiets op iedere pageview uitvoer? (denk aan 10.000 tot 100.000 pageviews per dag)

edit:
enhancement

edit:
bugfix

Localhost, sweet localhost


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 14-09 09:56
Is het nodig dat je de admin scripts apart uitvoert, of zou je ook met een transactie _binnen_ mysql afkunnen?

Met een recente mysql versie kan je transacties maken in SQL (met de InnoDB tabellen), en dat werkt vast een stuk eenvoudiger dan met files. En wat betreft performance zit je dan ook veel beter omdat de transacties alleen voor het admin script gedaan hoeven te worden.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025
Helaas kan ik vooraf niet garanderen wat voor mysqlversie er gebruikt gaat worden, zels niet welke PHP versie (al ga ik > 4.0 eisen).


Momenteel is mijn totale pseudocode:

Pagina stap 1:
Zet globale property readonly aan. (De site zal niet meer naar de cruciale backbone schrijven.)
Redirect naar stap 2

Stap 2:
vraag lock aan.
Doe gevaarlijk spul
Geef lock vrij.
Ze globale property readonly uit. (De site gaat weer lekker pageviews tellen.



Het gedeelte dat gelockt moet worden, is de backbone van de site. (menustructuur & rechten) De queries van stap 2 zijn zo ontworpen dat (uitgaand van table-level locking, default voor myIsam) de data altijd consistent blijft. Het enige wat mis zou kunnen gaan is dat twee admins tegelijk gaan schrijven...

Localhost, sweet localhost