1 changed files with 93 additions and 0 deletions
-
93pvtest.php
@ -0,0 +1,93 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/* |
||||
|
* Zunächst mal den Gedanken skizziert |
||||
|
* Da es kein wirklich zuverlässiges Locking fuer kritische Bereiche |
||||
|
* in php gibt. Semaphore existiren nur unter Unix und flock arbeitet nicht |
||||
|
* wenn der webserver threaded ist und keine separaten prozesse pro |
||||
|
* request erzeugt habe ich folgenden Gedankengang...nicht 100% Atomar, aber |
||||
|
* möglicherweise das beste was man bekommen kann. |
||||
|
* |
||||
|
* ACQUIRE |
||||
|
* ======= |
||||
|
* | |
||||
|
* - leere Datei erzeugen (tmp) |
||||
|
* - link (tmp) nach (lock) |
||||
|
* | |
||||
|
* |----------------------------- |
||||
|
* OK | | Fehler | |
||||
|
* | | | |
||||
|
* | | - lese (lock): sollte blockieren solange diese leer ist |
||||
|
* | | - unlink (lock) |
||||
|
* | | - link (tmp) nach (lock) |
||||
|
* | Fehler | | |
||||
|
* | ---------------| |
||||
|
* | | OK |
||||
|
* | | |
||||
|
* |----------------------------- |
||||
|
* | |
||||
|
* - (tmp) loeschen |
||||
|
* | |
||||
|
* (ENDE) |
||||
|
* |
||||
|
* RELEASE |
||||
|
* ======= |
||||
|
* | |
||||
|
* - schreibe nach (lock) |
||||
|
* | |
||||
|
* (ENDE) |
||||
|
* |
||||
|
* Da link angeblick atomar ist muesste das zumindest zuverlaessig Sperren... |
||||
|
* Zusaettzlich sollte man vielleicht noch ein Priorisierung irgendwo |
||||
|
* festhalten, um zu verhindern das ein Prozess ewig wartet, weil er immer |
||||
|
* Pech bei der zuweisung von CPU Zeit hat. |
||||
|
* |
||||
|
* So ein Pech, read blockiert natuerlich nicht bei regulären Dateien, da |
||||
|
* ja EOF erreich wird....da muss ich mir was anderes ausdenken.... |
||||
|
* OK, unter UNIX kann ich exec mkfifo machen um eine named pipe zu generieren. |
||||
|
* Fuer windows muss was anderes oder busy waiting (iiieeh) rein.... |
||||
|
* |
||||
|
* !!! Zur info, schon der read open auf eine FIFO blocked wenn kein Writer |
||||
|
* existiert. Das war auch ein aspekt den man berücksichtigen muß... !!! |
||||
|
*/ |
||||
|
|
||||
|
function acquire ($lock, $tmp) |
||||
|
{ |
||||
|
if (! file_exists ($tmp)) |
||||
|
exec ('mkfifo ' . $tmp); |
||||
|
// hier koennte irgendwas bzgl. der Priorisierung in nem else folgen...
|
||||
|
|
||||
|
if (link ($tmp, $lock) === FALSE) |
||||
|
{ |
||||
|
while (true) |
||||
|
{ |
||||
|
$handle = fopen ($lock, 'w'); |
||||
|
fwrite ($handel, '1'); |
||||
|
fclose ($handle); |
||||
|
if (unlink ($lock) === FALSE) continue; |
||||
|
if (link ($tmp, $lock) === FALSE) continue; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
unlink ($tmp); |
||||
|
} |
||||
|
|
||||
|
function release ($lock) |
||||
|
{ |
||||
|
$handle = fopen ($lock, 'r'); |
||||
|
stream_set_blocking ($handle, 0); |
||||
|
if (fread ($handle, 1) === 0) |
||||
|
unlink ($lock); |
||||
|
fclose ($handle); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
acquire ('lock', 'tmp'); |
||||
|
|
||||
|
echo "Lock bekommen\n"; |
||||
|
sleep (30); |
||||
|
|
||||
|
release ('lock'); |
||||
|
|
||||
|
?>
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue