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