Commit 56056fae911b2d62171ff3c6a641ed5cd08248df

Authored by Georg Hopp
1 parent 9b14281b

--no commit message

Showing 1 changed file with 93 additions and 0 deletions
  1 +<?php
  2 +
  3 +/*
  4 + * Zunächst mal den Gedanken skizziert
  5 + * Da es kein wirklich zuverlässiges Locking fuer kritische Bereiche
  6 + * in php gibt. Semaphore existiren nur unter Unix und flock arbeitet nicht
  7 + * wenn der webserver threaded ist und keine separaten prozesse pro
  8 + * request erzeugt habe ich folgenden Gedankengang...nicht 100% Atomar, aber
  9 + * möglicherweise das beste was man bekommen kann.
  10 + *
  11 + * ACQUIRE
  12 + * =======
  13 + * |
  14 + * - leere Datei erzeugen (tmp)
  15 + * - link (tmp) nach (lock)
  16 + * |
  17 + * |-----------------------------
  18 + * OK | | Fehler |
  19 + * | | |
  20 + * | | - lese (lock): sollte blockieren solange diese leer ist
  21 + * | | - unlink (lock)
  22 + * | | - link (tmp) nach (lock)
  23 + * | Fehler | |
  24 + * | ---------------|
  25 + * | | OK
  26 + * | |
  27 + * |-----------------------------
  28 + * |
  29 + * - (tmp) loeschen
  30 + * |
  31 + * (ENDE)
  32 + *
  33 + * RELEASE
  34 + * =======
  35 + * |
  36 + * - schreibe nach (lock)
  37 + * |
  38 + * (ENDE)
  39 + *
  40 + * Da link angeblick atomar ist muesste das zumindest zuverlaessig Sperren...
  41 + * Zusaettzlich sollte man vielleicht noch ein Priorisierung irgendwo
  42 + * festhalten, um zu verhindern das ein Prozess ewig wartet, weil er immer
  43 + * Pech bei der zuweisung von CPU Zeit hat.
  44 + *
  45 + * So ein Pech, read blockiert natuerlich nicht bei regulären Dateien, da
  46 + * ja EOF erreich wird....da muss ich mir was anderes ausdenken....
  47 + * OK, unter UNIX kann ich exec mkfifo machen um eine named pipe zu generieren.
  48 + * Fuer windows muss was anderes oder busy waiting (iiieeh) rein....
  49 + *
  50 + * !!! Zur info, schon der read open auf eine FIFO blocked wenn kein Writer
  51 + * existiert. Das war auch ein aspekt den man berücksichtigen muß... !!!
  52 + */
  53 +
  54 +function acquire ($lock, $tmp)
  55 +{
  56 + if (! file_exists ($tmp))
  57 + exec ('mkfifo ' . $tmp);
  58 + // hier koennte irgendwas bzgl. der Priorisierung in nem else folgen...
  59 +
  60 + if (link ($tmp, $lock) === FALSE)
  61 + {
  62 + while (true)
  63 + {
  64 + $handle = fopen ($lock, 'w');
  65 + fwrite ($handel, '1');
  66 + fclose ($handle);
  67 + if (unlink ($lock) === FALSE) continue;
  68 + if (link ($tmp, $lock) === FALSE) continue;
  69 + break;
  70 + }
  71 + }
  72 +
  73 + unlink ($tmp);
  74 +}
  75 +
  76 +function release ($lock)
  77 +{
  78 + $handle = fopen ($lock, 'r');
  79 + stream_set_blocking ($handle, 0);
  80 + if (fread ($handle, 1) === 0)
  81 + unlink ($lock);
  82 + fclose ($handle);
  83 +}
  84 +
  85 +
  86 +acquire ('lock', 'tmp');
  87 +
  88 +echo "Lock bekommen\n";
  89 +sleep (30);
  90 +
  91 +release ('lock');
  92 +
  93 +?>
Please register or login to post a comment