Showing
1 changed file
with
93 additions
and
0 deletions
pvtest.php
0 → 100644
| 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