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