Showing
3 changed files
with
1102 additions
and
2 deletions
1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" | |
2 | + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |
1 | 3 | <html> |
2 | 4 | <head> |
3 | 5 | <title>Meine ersten Ajax Erfahrungen</title> |
... | ... | @@ -27,11 +29,10 @@ |
27 | 29 | german_field.value = translation.german; |
28 | 30 | french_field.value = translation.french.val1; |
29 | 31 | } |
30 | - break; | |
32 | + return true; | |
31 | 33 | |
32 | 34 | default: |
33 | 35 | return false; |
34 | - break; | |
35 | 36 | } |
36 | 37 | } |
37 | 38 | ... | ... |
lock.php
0 → 100644
1 | +<? | |
2 | +//------------------------------------------- | |
3 | +// | |
4 | +// ocs_user_add - last update 2006-10-23 | |
5 | +// | |
6 | +// based on: | |
7 | +// | |
8 | +// Adressupdate - last update wgi 2006-05-23 | |
9 | +// | |
10 | +//------------------------------------------- | |
11 | + | |
12 | +header("Content-Type: text/html; charset=UTF-8"); | |
13 | +$basepath="/data/www/localhost/htdocs/inc"; | |
14 | + | |
15 | + | |
16 | +include "$basepath/mkhead.php"; | |
17 | + | |
18 | + | |
19 | +function load_users () | |
20 | +{ | |
21 | + $localFile = "/var/www/localhost/htdocs/osc_user_add/xfer/web-useradd"; | |
22 | + | |
23 | + exec ("scp webuseradd@vam-osc5:/etc/web-useradd ".$localFile." 2>&1", | |
24 | + $out, $ret); | |
25 | + | |
26 | + if ($ret != 0) | |
27 | + { | |
28 | + print "scp returns: ".$ret."<BR>\n"; | |
29 | + print "Output was:<BR><PRE>\n"; | |
30 | + | |
31 | + print_r ($out); | |
32 | + | |
33 | + print "</PRE>\n"; | |
34 | + } | |
35 | + else | |
36 | + { | |
37 | + $fh = fopen ($localFile, "r"); | |
38 | + | |
39 | + $line = fgets ($fh); | |
40 | + while (! feof ($fh)) | |
41 | + { | |
42 | + $buf = explode (":", trim ($line)); | |
43 | + if ($buf[1] == "") | |
44 | + $buf[1] = "no-change"; | |
45 | + if ($buf[4] != "delete") | |
46 | + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); | |
47 | + | |
48 | + $line = fgets ($fh); | |
49 | + } | |
50 | + | |
51 | + fclose ($fh); | |
52 | + } | |
53 | + | |
54 | + exec ("scp webuseradd@vam-osc6:/etc/web-useradd ".$localFile." 2>&1", | |
55 | + $out, $ret); | |
56 | + | |
57 | + if ($ret != 0) | |
58 | + { | |
59 | + print "scp returns: ".$ret."<BR>\n"; | |
60 | + print "Output was:<BR><PRE>\n"; | |
61 | + | |
62 | + print_r ($out); | |
63 | + | |
64 | + print "</PRE>\n"; | |
65 | + } | |
66 | + else | |
67 | + { | |
68 | + $fh = fopen ($localFile, "r"); | |
69 | + | |
70 | + $line = fgets ($fh); | |
71 | + while (! feof ($fh)) | |
72 | + { | |
73 | + $buf = explode (":", trim ($line)); | |
74 | + if ($buf[1] == "") | |
75 | + if ($users[$buf[0]] && $users[$buf[0]][0] != "") | |
76 | + $buf[1] = $users[$buf[0]][0]; | |
77 | + else | |
78 | + $buf[1] = "no-change"; | |
79 | + if ($buf[4] != "delete") | |
80 | + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); | |
81 | + | |
82 | + $line = fgets ($fh); | |
83 | + } | |
84 | + | |
85 | + fclose ($fh); | |
86 | + } | |
87 | + | |
88 | + exec ("rm ".$localFile." 2>&1", $out, $ret); | |
89 | + | |
90 | + return $users; | |
91 | +} | |
92 | + | |
93 | +function load_cats () | |
94 | +{ | |
95 | + /* | |
96 | + * OK, ich hole dir verfügbaren Rubriken anhand der existierenden | |
97 | + * Verzeichniss unter /vol1/www/bhi_upload. Will man also eine | |
98 | + * Rubrik hinzufügen, so muß man dort nur das Verzeichnis anlegen. | |
99 | + */ | |
100 | + exec ("ssh -l webuseradd vam-osc5 ". | |
101 | + "\"ls -p /vol1/www/bhi_upload | sed '/\/$/p;d'\" ". | |
102 | + "2>/dev/null", | |
103 | + $out, $ret); | |
104 | + | |
105 | + foreach ($out as $key=>$line) | |
106 | + $out[$key] = preg_replace ("/^(.*)\/$/", "\\1", $line); | |
107 | + | |
108 | + return $out; | |
109 | + /* return array ("kfz", "immo", "trauer"); */ | |
110 | +} | |
111 | + | |
112 | +function update_users ($users) | |
113 | +{ | |
114 | + $fh = fopen ("/tmp/web-useradd", "w"); | |
115 | + | |
116 | + foreach ($users as $key => $value) | |
117 | + { | |
118 | + fputs ($fh, $key.":".$value[0].":".$value[1].":". | |
119 | + $value[2].":".$value[3]."\n"); | |
120 | + } | |
121 | + | |
122 | + fclose ($fh); | |
123 | + | |
124 | + exec ("scp /tmp/web-useradd webuseradd@vam-osc5:/etc/web-useradd 2>&1", | |
125 | + $out, $ret); | |
126 | + | |
127 | + if ($ret != 0) | |
128 | + { | |
129 | + print "scp to vam-osc5 returns: ".$ret."<BR>\n"; | |
130 | + print "Output was:<BR><PRE>\n"; | |
131 | + | |
132 | + print_r ($out); | |
133 | + | |
134 | + print "</PRE>\n"; | |
135 | + } | |
136 | + | |
137 | + exec ("scp /tmp/web-useradd webuseradd@vam-osc6:/etc/web-useradd 2>&1", | |
138 | + $out, $ret); | |
139 | + | |
140 | + if ($ret != 0) | |
141 | + { | |
142 | + print "scp to vam-osc6 returns: ".$ret."<BR>\n"; | |
143 | + print "Output was:<BR><PRE>\n"; | |
144 | + | |
145 | + print_r ($out); | |
146 | + | |
147 | + print "</PRE>\n"; | |
148 | + } | |
149 | + | |
150 | + exec ("rm /tmp/web-useradd 2>&1", $out, $ret); | |
151 | +} | |
152 | + | |
153 | + | |
154 | +function show_users ($users) | |
155 | +{ | |
156 | + print "<H1>User auf vam-osc5 und vam-osc6</H1>\n"; | |
157 | + | |
158 | + if ($_SESSION['editable'] == TRUE) | |
159 | + { | |
160 | + print "<A href=\"".$SCRIPT_NAME."?action=add\">"; | |
161 | + print "Benutzer hinzufügen</A>"; | |
162 | + } | |
163 | + else | |
164 | + { | |
165 | + print "<A href=\"".$SCRIPT_NAME."?action=startedit\">"; | |
166 | + print "Benutzer bearbeiten</A>"; | |
167 | + } | |
168 | + | |
169 | + print "<TABLE border=\"0\">"; | |
170 | + | |
171 | + $rownum = 0; | |
172 | + | |
173 | + if (isset ($users)) | |
174 | + { | |
175 | + foreach ($users as $name => $data) | |
176 | + { | |
177 | + if (($rownum % 2) != 0) | |
178 | + { | |
179 | + $bg="#EEEEEE"; // leight | |
180 | + } | |
181 | + else | |
182 | + { | |
183 | + $bg="#CCCCCC"; // dark | |
184 | + } | |
185 | + | |
186 | + $tdStyle = ""; | |
187 | + $delText = "löschen"; | |
188 | + | |
189 | + if ($data[3] == "delete") | |
190 | + { | |
191 | + $tdStyle = "style=\"text-decoration: line-through;\""; | |
192 | + $delText = "nicht löschen"; | |
193 | + } | |
194 | + | |
195 | + print "<TR><TD width=70 bgcolor=".$bg." ".$tdStyle.">".$name."</TD>"; | |
196 | + print "<TD width=150 bgcolor=".$bg." ".$tdStyle.">".$data[1]."</TD>"; | |
197 | + print "<TD width=50 bgcolor=".$bg." ".$tdStyle.">".$data[2]."</TD>"; | |
198 | + if ($_SESSION['editable'] == TRUE) | |
199 | + { | |
200 | + if ($data[3] != "delete") | |
201 | + { | |
202 | + print "<TD><A href=\""; | |
203 | + print $SCRIPT_NAME."?action=edit&name=".$name."\">"; | |
204 | + print "bearbeiten</A></TD>"; | |
205 | + print "<TD><A href=\""; | |
206 | + } | |
207 | + else | |
208 | + print "<TD colspan=2><A href=\""; | |
209 | + print $SCRIPT_NAME."?action=delete&name=".$name."\">"; | |
210 | + print $delText."</A></TD>"; | |
211 | + } | |
212 | + print "</TR>\n"; | |
213 | + | |
214 | + $rownum ++; | |
215 | + } | |
216 | + } | |
217 | + | |
218 | + if ($_SESSION['editable'] == TRUE) | |
219 | + { | |
220 | + print "<TR><TD colspan=\"3\">"; | |
221 | + print "<A href=\"".$SCRIPT_NAME."?action=update\">abschicken</A>"; | |
222 | + print " <A href=\"".$SCRIPT_NAME."?action=abort\">abbrechen</A>"; | |
223 | + print "</TD></TR>"; | |
224 | + } | |
225 | + print "</TABLE>\n"; | |
226 | +} | |
227 | + | |
228 | +function edit_user ($users, $cats, $name) | |
229 | +{ | |
230 | + print "<FORM action=\"".$SCRIPT_NAME."?".strip_tags (SID)."\">"; | |
231 | + print "<INPUT type=\"HIDDEN\" name=\"action\" value=\"set\">"; | |
232 | + print "<INPUT type=\"HIDDEN\" name=\"oldpass\" value=\"".$users[$name][0]."\">"; | |
233 | + print "<TABLE border=\"0\">"; | |
234 | + print "<TR><TD>Username: </TD>"; | |
235 | + print "<TD width=\"300\">"; | |
236 | + | |
237 | + if (! isset ($name)) | |
238 | + { | |
239 | + print "<INPUT type=\"text\" name=\"name\" value=\"".$name."\"></TD>"; | |
240 | + } | |
241 | + else | |
242 | + { | |
243 | + print "<INPUT type=\"hidden\" name=\"name\" value=\"".$name."\">"; | |
244 | + print $name."</TD>"; | |
245 | + } | |
246 | + | |
247 | + print "</TR>\n"; | |
248 | + print "<TR><TD>Rubrik: </TD>"; | |
249 | + print "<TD width=\"300\">"; | |
250 | + print "<SELECT name=\"cat\" size=\"1\">"; | |
251 | + | |
252 | + foreach ($cats as $cat) | |
253 | + { | |
254 | + print "<OPTION"; | |
255 | + if ($users[$name][2] == $cat) | |
256 | + print " SELECTED>"; | |
257 | + else | |
258 | + print ">"; | |
259 | + | |
260 | + print $cat."</OPTION>"; | |
261 | + } | |
262 | + | |
263 | + print "</SELECT>"; | |
264 | + print "</TD>"; | |
265 | + print "</TR>\n"; | |
266 | + print "<TR><TD>Vollständiger Name: </TD>"; | |
267 | + print "<TD width=\"300\">"; | |
268 | + print "<INPUT type=\"text\" name=\"full\" value=\"".$users[$name][1]."\">"; | |
269 | + print "</TD>"; | |
270 | + print "</TR>\n"; | |
271 | + print "<TR><TD>Passwort: </TD>"; | |
272 | + print "<TD width=\"300\">"; | |
273 | + print "<INPUT type=\"password\" name=\"pass\" value=\"".$users[$name][0]."\">"; | |
274 | + print "</TD>"; | |
275 | + print "</TR>\n"; | |
276 | + print "<TR><TD colspan=\"2\" align=\"right\">"; | |
277 | + print "<A href=\"".$SCRIPT_NAME."?action=show\">abbrechen</A>"; | |
278 | + print " <INPUT type=\"submit\" value=\"abschicken\">"; | |
279 | + print "</TABLE>\n"; | |
280 | + print "</FORM>"; | |
281 | +} | |
282 | + | |
283 | +/* | |
284 | + * gibt FALSE zurück falls kein Lock gesetzt werden konnte, ansonsten die | |
285 | + * aktuelle lockid. Diese wird bei free_lock benötigt um den lock wieder | |
286 | + * freizugeben. | |
287 | + * Folgende Fälle können eintreten: | |
288 | + * 1. Das Lockfile enthält keine Daten und myId ist leer. | |
289 | + * Das bedeutet: es existiert keine Sperre auf die Daten und wir hatten | |
290 | + * bisher keine Sperre auf die Daten. | |
291 | + * Daraufhin wird eine neue lock-id generiert und zusammen mit dem | |
292 | + * aktuellen Timestamp in das lockfile gegeben. Die generierte lock-id | |
293 | + * wird zurückgegeben. | |
294 | + * 2. Das Lockfile enthält eine Sperre und myId ist leer. | |
295 | + * Das bedeutet: es existiert eine Sperre auf die Daten, die nicht von | |
296 | + * dieser PHP session generiert wurde. | |
297 | + * 2 Faelle: | |
298 | + * (lockTime + 300) >= time (): Die Sperre ist nicht abgelaufen => es | |
299 | + * kann keine neue Sperre angelegt werden. | |
300 | + * (lockTime + 300) < time (): Die Sperre ist abgelaufen => neue lock-id | |
301 | + * generieren, in Datei eintragen und | |
302 | + * zurückgeben. | |
303 | + * 3. Das Lockfile enthält eine Sperre und myId != lockId. | |
304 | + * Das bedeutet: In der aktuellen PHP session wurde erfolgreich eine | |
305 | + * Sperre erzeugt, die aber aufgrund dessen das ein timeout | |
306 | + * eingetreten ist (d.h. in der aktuellen Session wurde länger | |
307 | + * als 5 Minuten auf keinen link mehr geklickt.) nicht mehr | |
308 | + * gültig war und in der zwischenzeit hat jemand anderes | |
309 | + * daher eine neue Sperre auf die Daten eingerichtet siehe 2. | |
310 | + * folgende Fälle: | |
311 | + * die 2 Unterfälle von 2. | |
312 | + * 4. Das Lockfile enthält keine Daten, aber myId ist nicht leer. | |
313 | + * Das bedeutet: In der aktuellen PHP session wurde ein lock eingerichtet. | |
314 | + * Der Timeout verstrich und jemand anderes hat änderungen | |
315 | + * an den Daten vorgenommen. Konsequenz: Die Daten in dieser | |
316 | + * PHP session sind nicht mehr aktuell. | |
317 | + * Da der aktuelle Lock daher komplett ungültig geworden ist wird nichts | |
318 | + * in die Datei eingetragen und eine leere lock-id zurückgegeben. | |
319 | + * An anderer Stelle (check_lock) werden anhand der Information das myId | |
320 | + * nich leer war, aber die zurückgegebene id leer ist alle anderen Daten | |
321 | + * neu initialisiert. | |
322 | + * 5. Das Lockfile enthält eine Sperre und myId == lockId. | |
323 | + * Das bedeutet: Innerhalb dieser PHP session wurde eine Sperre eingerichtet | |
324 | + * die auch weiterhin gültig ist. | |
325 | + * Die lockTime wird in der Datei aktualisiert und lockId zurückgegeben. | |
326 | + */ | |
327 | +function get_lock ($lockFile, $myId) | |
328 | +{ | |
329 | + $newId = ""; | |
330 | + | |
331 | + $lockFd = fopen ($lockFile, "a+"); | |
332 | + if ($lockFd != FALSE) | |
333 | + { | |
334 | + if (flock ($lockFd, LOCK_EX) != FALSE) | |
335 | + { | |
336 | + rewind ($lockFd); | |
337 | + $lockEntry = explode ('/', trim (fgets ($lockFd))); | |
338 | + $lockId = $lockEntry[0]; | |
339 | + $lockTime = $lockEntry[1]; | |
340 | + | |
341 | + if ($lockId == $myId || | |
342 | + /* lockTime nur pruefen wenn Sie in der Datei stand */ | |
343 | + ($lockTime != "" && ($lockTime + 300) < time ())) | |
344 | + { | |
345 | + ftruncate ($lockFd, 0); | |
346 | + if ($lockId != "" && $lockId == $myId) | |
347 | + $newId = $myId; | |
348 | + else | |
349 | + $newId = uniqid (); | |
350 | + fputs ($lockFd, $newId."/".time ()."\n"); | |
351 | + } | |
352 | + | |
353 | + fclose ($lockFd); | |
354 | + } | |
355 | + } | |
356 | + | |
357 | + return $newId; | |
358 | +} | |
359 | + | |
360 | +function free_lock ($lockFile, $lockId) | |
361 | +{ | |
362 | + $lockFd = fopen ($lockFile, "r+"); | |
363 | + if ($lockFd != FALSE) | |
364 | + { | |
365 | + if (flock ($lockFd, LOCK_EX) != FALSE) | |
366 | + { | |
367 | + $lockEntry = explode ('/', trim (fgets ($lockFd))); | |
368 | + $oldId = $lockEntry[0]; | |
369 | + | |
370 | + if ($lockId == $oldId) | |
371 | + ftruncate ($lockFd, 0); | |
372 | + | |
373 | + fclose ($lockFd); | |
374 | + } | |
375 | + } | |
376 | +} | |
377 | + | |
378 | +function check_lock ($lockFile, $lockId) | |
379 | +{ | |
380 | + if ($_SESSION['editable'] == TRUE) | |
381 | + { | |
382 | + $gotId = get_lock ($lockFile, $lockId); | |
383 | + | |
384 | + if ($gotId == FALSE) | |
385 | + { | |
386 | + if ($lockId == FALSE) | |
387 | + { | |
388 | + print "<TABLE BGCOLOR=\"yellow\"><TR><TD>Konnte keine Sperre zum "; | |
389 | + print "bearbeiten der Benutzerdaten anlegen. Jemand anderes "; | |
390 | + print "bearbeitet die Daten bereits. Bitte versuchen Sie es in ein "; | |
391 | + print "paar Minuten noch einmal.</TD></TR></TABLE>"; | |
392 | + } | |
393 | + else | |
394 | + { | |
395 | + print "<TABLE BGCOLOR=\"yellow\"><TR><TD>Ihre Sperre ist "; | |
396 | + print "ungültig. Vermutlich haben Sie länger als fünf "; | |
397 | + print "Minuten keine Modifikationen vorgenommen und jemand "; | |
398 | + print "anderes bearbeitet jetzt Benutzerdaten. Leider sind ihre "; | |
399 | + print "bisherigen Änderungen dadurch ungültig geworden. "; | |
400 | + print "Bitte versuchen Sie es in ein paar Minuten noch einmal."; | |
401 | + print "</TD></TR></TABLE>"; | |
402 | + } | |
403 | + } | |
404 | + | |
405 | + return $gotId; | |
406 | + } | |
407 | + | |
408 | + return ""; | |
409 | +} | |
410 | + | |
411 | + | |
412 | + | |
413 | + | |
414 | +$_action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'load'; | |
415 | + | |
416 | +session_start (); | |
417 | + | |
418 | +$_SESSION['lockFile'] = | |
419 | + '/var/www/localhost/htdocs/osc_user_add/webuseradd.lck'; | |
420 | + | |
421 | +mkhead ("Benutzer auf vam-osc5 und vam-osc6 anlegen ...", | |
422 | + "bar-edvtools", | |
423 | + "Benutzertool vam-osc5 und vam-osc6"); | |
424 | + | |
425 | +if ($_action == "load" || $_action == "startedit") | |
426 | +{ | |
427 | + session_unregister ("users"); | |
428 | + session_unregister ("cats"); | |
429 | +} | |
430 | + | |
431 | +if (! isset ($_SESSION['users'])) | |
432 | + $_SESSION['users'] = load_users (); | |
433 | + | |
434 | +if (! isset ($_SESSION['cats'])) | |
435 | + $_SESSION['cats'] = load_cats (); | |
436 | + | |
437 | +if (! isset ($_SESSION['editable'])) | |
438 | + $_SESSION['editable'] = FALSE; | |
439 | + | |
440 | +if ($_action == 'startedit') | |
441 | + $_SESSION['editable'] = TRUE; | |
442 | + | |
443 | +$_SESSION['lockId'] = check_lock ($_SESSION['lockFile'], $_SESSION['lockId']); | |
444 | +if ($_SESSION['lockId'] == FALSE) | |
445 | +{ | |
446 | + $_SESSION['editable'] = FALSE; | |
447 | + | |
448 | + show_users ($_SESSION['users']); | |
449 | +} | |
450 | +else | |
451 | +{ | |
452 | + switch ($_action) | |
453 | + { | |
454 | + case 'edit': | |
455 | + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); | |
456 | + break; | |
457 | + case 'set': | |
458 | + $pass = $_REQUEST['pass']=="no-change"?$_REQUEST['pass']: | |
459 | + $_REQUEST['oldpass']==$_REQUEST['pass']?$_REQUEST['pass']: | |
460 | + crypt ($_REQUEST['pass'], $_REQUEST['name']); | |
461 | + | |
462 | + $_SESSION['users'][$_REQUEST['name']] = | |
463 | + array ($pass, | |
464 | + $_REQUEST['full'], | |
465 | + $_REQUEST['cat'], | |
466 | + time ()); | |
467 | + show_users ($_SESSION['users']); | |
468 | + break; | |
469 | + case 'update': | |
470 | + update_users ($_SESSION['users']); | |
471 | + print "<TABLE><TR><TD bgcolor=\"yellow\">Daten wurden aktualisiert. "; | |
472 | + print "Es kann einige Minuten dauern bis das System die "; | |
473 | + print "Änderung übernimmt.</TD></TR></TABLE>\n"; | |
474 | + case 'abort': | |
475 | + free_lock ($_SESSION['lockFile'], $_SESSION['lockId']); | |
476 | + $_SESSION['lockId'] = ""; | |
477 | + $_SESSION['editable'] = FALSE; | |
478 | + show_users ($_SESSION['users']); | |
479 | + break; | |
480 | + case 'add': | |
481 | + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); | |
482 | + break; | |
483 | + case 'delete': | |
484 | + if ($_SESSION['users'][$_REQUEST['name']][3] != "delete") | |
485 | + $_SESSION['users'][$_REQUEST['name']][3] = "delete"; | |
486 | + else | |
487 | + $_SESSION['users'][$_REQUEST['name']][3] = time (); | |
488 | + show_users ($_SESSION['users']); | |
489 | + break; | |
490 | + case 'show': | |
491 | + default: | |
492 | + show_users ($_SESSION['users']); | |
493 | + } | |
494 | +} | |
495 | +?> | |
496 | +</td> | |
497 | +</tr> | |
498 | +<tr> | |
499 | +</tr> | |
500 | +</table> | |
501 | +<PRE> | |
502 | +</PRE> | |
503 | +</body> | |
504 | +</html> | ... | ... |
utils_cache.php
0 → 100644
1 | +<?php | |
2 | + | |
3 | +/** | |
4 | + * Mit der Funktion printCachedPage kann ein Script/Modul seinen dynamisch | |
5 | + * erzeugten HTML-Inhalt cachen und als statisches HTML einbinden. Die | |
6 | + * erzeugten HTML-Dateien liegen unter CACHEDIR/<subclientid>/<script-path>/ | |
7 | + * <scriptname>?md5(<request-parameter-liste>).html | |
8 | + * | |
9 | + * Es wird für jede Seite und jeden Request-Parameter-Kombination, der in | |
10 | + * $allowed_req_params angegeben ist, eine Seite im Cache angelegt. | |
11 | + * | |
12 | + * Parameter: | |
13 | + * - $auto_update: erzeugt bei Scriptaufruf eine neue Cache-Datei, wenn: | |
14 | + * a) die Cachedatei älter ist als die Scriptdatei oder | |
15 | + * b) die Cachedatei älter ist als eine per include/require eingebunden | |
16 | + * Scriptdatei | |
17 | + * - $update_interval: eine Erneuerung der Cachedatei wird vorgenommen, wenn | |
18 | + * die Cachedatei älter als $update_interval ist. | |
19 | + * - $script-file: das Script, dessen Inhalt gecached werden soll, i.d.R | |
20 | + * __FILE__ | |
21 | + * - $allowed_req_params: Liste der erlaubten Request-Parameter, dient zur | |
22 | + * Bildung des Cachedateinamens | |
23 | + * - $debug: erzeugt Debug-Ausgaben | |
24 | + * | |
25 | + * Die Einbindung in ein Script erfolgt nach Einbindung per include/require | |
26 | + * der zusätzlich erforderlichen Bibliothen mit: | |
27 | + * | |
28 | + * if (printCachedPage($auto_update,$update_interval,__FILE__)) | |
29 | + * return; | |
30 | + * | |
31 | + * Der mit printCachedPage erzeugte HTML-Bereich wird mit HTML-Kommentaren | |
32 | + * umrandet und kann so im Gesamt-Quelltext identifiziert werden. | |
33 | + */ | |
34 | + | |
35 | +define ('MAX_CACHE_WAIT_SECS',1); | |
36 | + | |
37 | +function printCachedPage ( | |
38 | + $script_file, | |
39 | + $auto_update = true, | |
40 | + $update_interval = 86400, | |
41 | + $allowed_req_params = -1, | |
42 | + $debug = 0) | |
43 | +{ | |
44 | + if (USE_SCRIPT_CACHE == 0) | |
45 | + return 0; | |
46 | + | |
47 | + $em_parameter = ""; | |
48 | + if (isset ($_REQUEST["em_parameter"])) | |
49 | + $em_parameter = $_REQUEST["em_parameter"]; | |
50 | + if (!empty($em_parameter)) | |
51 | + $GLOBALS["em_parameter"] = $em_parameter; | |
52 | + if (!empty($GLOBALS["em_parameter"])) | |
53 | + $em_parameter = $GLOBALS["em_parameter"]; | |
54 | + | |
55 | + $content = ""; | |
56 | + if (isset($_REQUEST["NOCACHE"])) | |
57 | + { | |
58 | + if (isset($_REQUEST["PHP_SELF"])) | |
59 | + { | |
60 | + $_SERVER["PHP_SELF"]=$_REQUEST["PHP_SELF"]; | |
61 | + | |
62 | + // --- DEBUG OUTPUT ------- | |
63 | + if ($debug) | |
64 | + echo "<br />PHP_SELF wurde gesetzt: " . $_SERVER["PHP_SELF"]; | |
65 | + // --- END DEBUG OUTPUT --- | |
66 | + | |
67 | + } | |
68 | + return 0; | |
69 | + } | |
70 | + | |
71 | + // --- DEBUG OUTPUT ------- | |
72 | + $t1 = NULL; | |
73 | + | |
74 | + if ($debug) | |
75 | + $t1 = getMilliSeconds (); | |
76 | + | |
77 | + if ($debug) | |
78 | + { | |
79 | + echo "<br />Startzeit: ".strftime("%H:%M:%S"); | |
80 | + echo "<br />Script-Datei: ".$script_file; | |
81 | + echo "<br />PHP_SELF: ".$_SERVER["PHP_SELF"]; | |
82 | + echo "<br />Erlaubte Cache-Dateien pro Verzeichnis: " . | |
83 | + MAX_FILES_IN_CACHE_DIR; | |
84 | + } | |
85 | + // --- END DEBUG OUTPUT --- | |
86 | + | |
87 | + $subclient_id = getSubclientIDByUrl(); | |
88 | + | |
89 | + $len = strlen ($_SERVER["DOCUMENT_ROOT"]); | |
90 | + $script_name = substr ($script_file, $len); | |
91 | + | |
92 | + // --- DEBUG OUTPUT ------- | |
93 | + if ($debug) | |
94 | + echo "<br>DOCUMENT ROOT: " . $_SERVER["DOCUMENT_ROOT"]; | |
95 | + | |
96 | + if ($debug) | |
97 | + echo "<br />Script-Name: $script_name"; | |
98 | + // --- END DEBUG OUTPUT --- | |
99 | + | |
100 | + $cache_file = realpath (CACHEDIR) . "/" . $subclient_id . "/" . | |
101 | + substr(dirname($script_name),1) . "/" . basename($script_name) . "/" . | |
102 | + basename($script_name,".php"); | |
103 | + | |
104 | + $params = ""; | |
105 | + $query_string = ""; | |
106 | + | |
107 | + foreach ($_REQUEST as $key => $val) | |
108 | + { | |
109 | + if (is_array ($allowed_req_params) && | |
110 | + in_array ($key,$allowed_req_params)) | |
111 | + { | |
112 | + $val = urlencode (trim($val)); | |
113 | + $key = urlencode (trim($key)); | |
114 | + | |
115 | + // --- DEBUG OUTPUT ------- | |
116 | + if ($debug) | |
117 | + echo "<br />Hänge Request-Parameter an: _$key-$val"; | |
118 | + // --- END DEBUG OUTPUT --- | |
119 | + | |
120 | + $params .= "_". $key . "-" . $val; | |
121 | + $query_string .= $key . "=" . $val . "&"; | |
122 | + } | |
123 | + } | |
124 | + | |
125 | + if (!empty ($em_parameter)) | |
126 | + { | |
127 | + $params .= "_" . $em_parameter; | |
128 | + $query_string .= "em_parameter=" . $em_parameter; | |
129 | + } | |
130 | + | |
131 | + if (!empty ($params)) | |
132 | + $cache_file = $cache_file . "_" . md5($params) . ".html"; | |
133 | + else | |
134 | + $cache_file = $cache_file . ".html"; | |
135 | + | |
136 | + $url = getProtocol () . "://" . $_SERVER["SERVER_NAME"] . $script_name . | |
137 | + "?" . $query_string; | |
138 | + $cached_dir = dirname($cache_file); | |
139 | + | |
140 | + // --- DEBUG OUTPUT ------- | |
141 | + if ($debug) | |
142 | + { | |
143 | + echo "<br />Cache-Datei: $cache_file"; | |
144 | + echo "<br />Script-Datei: $script_file"; | |
145 | + echo "<br />URL: ".htmlspecialchars($url); | |
146 | + echo "<br />Cache Dir: $cached_dir"; | |
147 | + } | |
148 | + // --- END DEBUG OUTPUT --- | |
149 | + | |
150 | + if (!is_dir ($cached_dir)) | |
151 | + { | |
152 | + if (!is_dir (CACHEDIR . $subclient_id)) | |
153 | + mkdir (CACHEDIR . $subclient_id); | |
154 | + $cachedir = CACHEDIR . $subclient_id; | |
155 | + | |
156 | + $dir_arr = explode ("/", dirname($script_name) . "/" . | |
157 | + basename($script_name)); | |
158 | + | |
159 | + foreach ($dir_arr as $dir) | |
160 | + { | |
161 | + if (!is_dir($cachedir . "/" . $dir)) | |
162 | + { | |
163 | + mkdir ($cachedir. "/" . $dir); | |
164 | + chmod ($cachedir. "/" . $dir, 0777); | |
165 | + | |
166 | + // --- DEBUG OUTPUT ------- | |
167 | + if ($debug) | |
168 | + echo "<br />Erzeuge Verzeichnis: $cachedir/$dir"; | |
169 | + // --- END DEBUG OUTPUT --- | |
170 | + } | |
171 | + $cachedir .= "/" . $dir; | |
172 | + } | |
173 | + } | |
174 | + | |
175 | + $is_updated = 0; | |
176 | + if (!file_exists ($cache_file)) | |
177 | + { | |
178 | + $file_count = count (scandir ($cached_dir)) - 2; | |
179 | + | |
180 | + // --- DEBUG OUTPUT ------- | |
181 | + if ($debug) | |
182 | + echo "<br />Es sind $file_count im Cacheverzeichnis. " . | |
183 | + "Erlaubt sind " . MAX_FILES_IN_CACHE_DIR. "."; | |
184 | + // --- END DEBUG OUTPUT --- | |
185 | + | |
186 | + if ($file_count <= MAX_FILES_IN_CACHE_DIR) | |
187 | + { | |
188 | + $content = makeCacheFile ($cache_file, $url, $debug); | |
189 | + $is_updated = 1; | |
190 | + | |
191 | + // --- DEBUG OUTPUT ------- | |
192 | + if ($debug) | |
193 | + echo "<br />Cache-Datei wurde erzeugt, " . | |
194 | + "weil diese nicht existierte."; | |
195 | + // --- END DEBUG OUTPUT --- | |
196 | + } | |
197 | + else | |
198 | + { | |
199 | + // --- DEBUG OUTPUT ------- | |
200 | + if ($debug) | |
201 | + { | |
202 | + echo "<br />Es sind mehr Dateien im Cacheverzeichnis als " . | |
203 | + "erlaubt: " . $file_count . | |
204 | + "<br />Die Seite kann daher nicht gecached werden."; | |
205 | + } | |
206 | + // --- END DEBUG OUTPUT --- | |
207 | + } | |
208 | + } | |
209 | + else | |
210 | + { | |
211 | + if ($auto_update) | |
212 | + { | |
213 | + $do_update=0; | |
214 | + | |
215 | + if (filemtime($cache_file) < filemtime($script_file)) | |
216 | + { | |
217 | + $do_update = 1; | |
218 | + | |
219 | + // --- DEBUG OUTPUT ------- | |
220 | + if ($debug) | |
221 | + echo "<br />Cache-Datei wird erzeugt, weil die Cache-Datei " . | |
222 | + "älter als die Script-Datei ist."; | |
223 | + // --- END DEBUG OUTPUT --- | |
224 | + } | |
225 | + else | |
226 | + { | |
227 | + $includes = get_included_files (); | |
228 | + | |
229 | + foreach($includes as $inc) | |
230 | + { | |
231 | + if (strstr ($inc, realpath (HOME . "/../"))) | |
232 | + { | |
233 | + // --- DEBUG OUTPUT ------- | |
234 | + if ($debug) | |
235 | + echo "<br />Untersuche Abhängigkeiten von $inc"; | |
236 | + // --- END DEBUG OUTPUT --- | |
237 | + | |
238 | + if (filemtime($inc) > filemtime($cache_file)) | |
239 | + { | |
240 | + $do_update=1; | |
241 | + | |
242 | + // --- DEBUG OUTPUT ------- | |
243 | + if ($debug) | |
244 | + echo "<br />Cache-Datei wird erzeugt, weil " . | |
245 | + $inc . "verändert wurde."; | |
246 | + // --- END DEBUG OUTPUT --- | |
247 | + | |
248 | + break; | |
249 | + } | |
250 | + } | |
251 | + } | |
252 | + } | |
253 | + | |
254 | + if (!$do_update) | |
255 | + { | |
256 | + $content = getCacheContent ($cache_file, $debug); | |
257 | + } | |
258 | + else | |
259 | + { | |
260 | + $content = makeCacheFile ($cache_file, $url, $debug); | |
261 | + $is_updated = 1; | |
262 | + | |
263 | + // --- DEBUG OUTPUT ------- | |
264 | + if ($debug) | |
265 | + echo "<br />Cache-Datei wurde erzeugt: Auto-Update"; | |
266 | + // --- END DEBUG OUTPUT --- | |
267 | + } | |
268 | + } | |
269 | + | |
270 | + if ($update_interval >= 10 && !$is_updated) | |
271 | + { | |
272 | + $diff = time() - filemtime($cache_file); | |
273 | + | |
274 | + // --- DEBUG OUTPUT ------- | |
275 | + if ($debug) | |
276 | + echo "<br />Noch " . $update_interval - $diff . | |
277 | + " Sekunden bis zum nächsten Interval-Update"; | |
278 | + // --- END DEBUG OUTPUT --- | |
279 | + | |
280 | + if ($diff > $update_interval) | |
281 | + { | |
282 | + $content = makeCacheFile($cache_file, $url, $debug); | |
283 | + $is_updated=1; | |
284 | + | |
285 | + // --- DEBUG OUTPUT ------- | |
286 | + if ($debug) | |
287 | + echo "<br />Cache-Datei wurde erzeugt: Interval-Update"; | |
288 | + // --- END DEBUG OUTPUT --- | |
289 | + } | |
290 | + else | |
291 | + { | |
292 | + $content = getCacheContent($cache_file, $debug); | |
293 | + } | |
294 | + } | |
295 | + } | |
296 | + | |
297 | + // --- DEBUG OUTPUT ------- | |
298 | + if ($debug) | |
299 | + echo "<hr />"; | |
300 | + // --- END DEBUG OUTPUT --- | |
301 | + | |
302 | + if (!empty($content)) | |
303 | + echo "\n<!-- Cache-Bereich Anfang: ".basename($script_name)." -->\n"; | |
304 | + echo $content; | |
305 | + if (!empty($content)) | |
306 | + echo "\n<!-- Cache-Bereich Ende: ".basename($script_name)." -->\n"; | |
307 | + | |
308 | + // --- DEBUG OUTPUT ------- | |
309 | + if ($debug) | |
310 | + echo "<hr /><p />Gecachter Content wurde ausgeliefert."; | |
311 | + if ($debug) | |
312 | + echo "<br />Verarbeitungsdauer (in ms): ".(intval(getMilliSeconds()-$t1)); | |
313 | + // --- END DEBUG OUTPUT --- | |
314 | + | |
315 | + if (empty($content)) | |
316 | + return 0; | |
317 | + else | |
318 | + return 1; | |
319 | +} | |
320 | + | |
321 | +function makeCacheFile($cache_file, $url, $debug) | |
322 | +{ | |
323 | + if (preg_match("/^http.*\?.*/",$url)) | |
324 | + $url = $url."&NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]); | |
325 | + else | |
326 | + $url = $url."?NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]); | |
327 | + | |
328 | + if ($debug) | |
329 | + echo "<br />Encoded URL: $url"; | |
330 | + | |
331 | + // --- DEBUG OUTPUT ------- | |
332 | + $t1 = ''; | |
333 | + if ($debug) | |
334 | + $t1=getMilliSeconds(); | |
335 | + // --- END DEBUG OUTPUT --- | |
336 | + | |
337 | + $content = file_get_contents($url); | |
338 | + | |
339 | + // --- DEBUG OUTPUT ------- | |
340 | + if ($debug) | |
341 | + echo "<br />Laden der Seite ohne Cache dauerte: " . | |
342 | + getMilliSeconds() - $t1 . " ms"; | |
343 | + flush(); | |
344 | + | |
345 | + if ($debug) | |
346 | + { | |
347 | + echo "<br />Cache-Datei ist gesperrt: "; | |
348 | + var_dump (is_file ($cache_file.".LCK")); | |
349 | + } | |
350 | + // --- END DEBUG OUTPUT --- | |
351 | + | |
352 | + $ctr = 0; | |
353 | + while (cacheFileIsLocked ($cache_file)) | |
354 | + { | |
355 | + usleep (100000); | |
356 | + $ctr++; | |
357 | + if ($debug) | |
358 | + { | |
359 | + echo "<br />Cache-Datei ist gesperrt ..."; | |
360 | + flush(); | |
361 | + } | |
362 | + if ($ctr>(MAX_CACHE_WAIT_SECS*10)) | |
363 | + return $content; | |
364 | + clearstatcache(); | |
365 | + } | |
366 | + $is_locked = lockCacheFile($cache_file); | |
367 | + if ($is_locked) | |
368 | + { | |
369 | + $fp = fopen($cache_file, "w"); | |
370 | + if ($fp) | |
371 | + { | |
372 | + fwrite($fp,$content); | |
373 | + | |
374 | + // for ($x=0;$x<25;$x++) | |
375 | + // { | |
376 | + // echo "<br />Test sleep ... $x"; | |
377 | + // flush(); | |
378 | + // sleep(1); | |
379 | + // } | |
380 | + | |
381 | + fclose($fp); | |
382 | + chmod($cache_file,0777); | |
383 | + } | |
384 | + } else | |
385 | + if ($debug) | |
386 | + echo "<br />Cache-Datei konnte nicht geschrieben werden, " . | |
387 | + "weil die Lock-Datei nicht gesperrt werden konnte"; | |
388 | + if ($is_locked) | |
389 | + unlockCacheFile($cache_file); | |
390 | + return $content; | |
391 | +} | |
392 | + | |
393 | +function lockCacheFile($cache_file) | |
394 | +{ | |
395 | + $lock_file = $cache_file.".LCK"; | |
396 | + if (is_file($lock_file)) | |
397 | + { | |
398 | + if (is_writable($lock_file)) | |
399 | + { | |
400 | + chmod($lock_file,0555); | |
401 | + clearstatcache(); | |
402 | + return 1; | |
403 | + } | |
404 | + else | |
405 | + return 0; | |
406 | + } else | |
407 | + { | |
408 | + $fp = fopen($lock_file,'w'); | |
409 | + if ($fp) | |
410 | + { | |
411 | + fclose($fp); | |
412 | + chmod($lock_file,0555); | |
413 | + clearstatcache(); | |
414 | + return 1; | |
415 | + } else | |
416 | + return 0; | |
417 | + } | |
418 | +} | |
419 | + | |
420 | +function unlockCacheFile($cache_file) | |
421 | +{ | |
422 | + $lock_file = $cache_file.".LCK"; | |
423 | + chmod($lock_file,0777); | |
424 | + if (is_file($lock_file)) | |
425 | + { | |
426 | + unlink($lock_file); | |
427 | + clearstatcache(); | |
428 | + } | |
429 | +} | |
430 | + | |
431 | +function cacheFileIsLocked($cache_file) | |
432 | +{ | |
433 | + $lock_file = $cache_file.".LCK"; | |
434 | + $is_locked = is_file($lock_file); | |
435 | + | |
436 | + if ($is_locked) | |
437 | + return 1; | |
438 | + return 0; | |
439 | +} | |
440 | + | |
441 | +function getProtocol() | |
442 | +{ | |
443 | + $proto = $_SERVER["SERVER_PROTOCOL"]; | |
444 | + if (preg_match("/^HTTP\/.*$/",$proto)) | |
445 | + return 'http'; | |
446 | + if (preg_match("/^HTTPS\/.*$/",$proto)) | |
447 | + return 'https'; | |
448 | +} | |
449 | + | |
450 | +function getCacheContent($cache_file, $debug) | |
451 | +{ | |
452 | + $ctr = 0; | |
453 | + while (cacheFileIsLocked($cache_file)) | |
454 | + { | |
455 | + usleep(100000); | |
456 | + $ctr++; | |
457 | + if ($debug) | |
458 | + { | |
459 | + echo "<br />Kann Content nicht ausliefern, da Cache-Datei gesperrt ist ..."; | |
460 | + flush(); | |
461 | + } | |
462 | + if ($ctr>(MAX_CACHE_WAIT_SECS*10)) | |
463 | + return ""; | |
464 | + clearstatcache(); | |
465 | + } | |
466 | + return file_get_contents($cache_file); | |
467 | +} | |
468 | + | |
469 | +function cleanupCache() | |
470 | +{ | |
471 | + $log = "<h3>Cleanup Cache Script</h3>\n<ul>"; | |
472 | + $def_vars = get_defined_constants(); | |
473 | + | |
474 | + if (!array_key_exists('CACHE_CLEANUP_TIME',$def_vars)) | |
475 | + { | |
476 | + $log .= "<li>Konstante CACHE_CLEANUP_TIME ist nicht definiert - breche Cleanup-Skript ab.</li></ul>"; | |
477 | + return $log; | |
478 | + } else if (!array_key_exists('CACHECLEANUPFILE',$def_vars)) | |
479 | + { | |
480 | + $log .= "<li>Konstante CACHECLEANUPFILE ist nicht definiert - breche Cleanup-Skript ab.</li></ul>"; | |
481 | + return $log; | |
482 | + } else | |
483 | + if (!preg_match("/^([0-9][0-9]:[0-9][0-9],{0,1})*$/",CACHE_CLEANUP_TIME)) | |
484 | + { | |
485 | + $log .= "<li>Konstante CACHE_CLEANUP_TIME '".CACHE_CLEANUP_TIME."' ist im falschen Format - breche Cleanup-Skript ab.</li></ul>"; | |
486 | + return $log; | |
487 | + } | |
488 | + | |
489 | + $cachecleanup_file = CACHEDIR.CACHECLEANUPFILE; | |
490 | + $cleanup = 0; | |
491 | + $err_reporting = ini_get("error_reporting"); | |
492 | + ini_set("error_reporting",0); | |
493 | + | |
494 | + if (file_exists($cachecleanup_file)) | |
495 | + { | |
496 | + $lastmodified = filemtime($cachecleanup_file); | |
497 | + $cachecleanup_file = realpath($cachecleanup_file); | |
498 | + $log .= "<li>Cache-Cleanup-Datei $cachecleanup_file existiert.</li>"; | |
499 | + $log .= "<li>Cache-Cleanup-Datei $cachecleanup_file wurde letzmals aktualisiert am: ".strftime("%d.%m.%Y %H:%M:%S",$lastmodified)." Uhr</li>"; | |
500 | + | |
501 | + } | |
502 | + else | |
503 | + $lastmodified = -1; | |
504 | + $cleanuptime_arr = explode(",",CACHE_CLEANUP_TIME); | |
505 | + foreach($cleanuptime_arr as $cleanup_time) | |
506 | + { | |
507 | + $log .= "<li><b>Checke Cleanup-Time $cleanup_time Uhr</b><ul>"; | |
508 | + $ct_arr = explode(":",$cleanup_time); | |
509 | + if (count($ct_arr)>=2) | |
510 | + { | |
511 | + $hour = $ct_arr[0]; | |
512 | + $minute = $ct_arr[1]; | |
513 | + $today = getdate(); | |
514 | + $cleanup_timestamp = mktime($hour,$minute,0,$today["mon"],$today["mday"],$today["year"]); | |
515 | + $now = time(); | |
516 | + $diff1 = $now-$cleanup_timestamp; | |
517 | + $log .= "<li>Untersuche Differenz: now()-$cleanup_time=$diff1 Sekunden</li>"; | |
518 | + if ($diff1>0) | |
519 | + { | |
520 | + $log .= "<li>Cleanup-Zeitpunkt ist überschritten</li>"; | |
521 | + if ($cleanup_timestamp>$lastmodified) | |
522 | + { | |
523 | + $cleanup=1; | |
524 | + $log .= "<li>Cleanup-Zeitpunkt muss durchgeführt werden.</li>"; | |
525 | + } else | |
526 | + $log .= "<li>Kein Cleanup erforderlich, weil ".basename($cachecleanup_file)." nach der Cleanup-Zeit" . | |
527 | + " $cleanup_time Uhr verändert wurde."; | |
528 | + } else | |
529 | + $log .= "<li>Kein Cleanup erforderlich. Es dauert noch ".(-$diff1)." Sekunden bis zum nächsten Cleanup.</li>"; | |
530 | + } | |
531 | + $log .= "</ul></li>"; | |
532 | + } | |
533 | + | |
534 | + if ($cleanup) | |
535 | + { | |
536 | + $log .= "<li><b>Führe jetzt Cleanup durch ...</b>"; | |
537 | + $files = scandir(CACHEDIR); | |
538 | + | |
539 | + foreach($files as $key=>$file) | |
540 | + { | |
541 | + if ($file=='.' || | |
542 | + $file=='..' || | |
543 | + $file=='.svn' || | |
544 | + $file==LASTLOGFILE || | |
545 | + $file==CACHECLEANUPFILE) | |
546 | + unset($files[$key]); | |
547 | + } | |
548 | + | |
549 | + if (count($files)==0) | |
550 | + $log .= "<li>Cache ist leer.</li>"; | |
551 | + foreach($files as $file) | |
552 | + { | |
553 | + $file = realpath(CACHEDIR.$file); | |
554 | + $success = 0; | |
555 | + if (is_file($file)) | |
556 | + { | |
557 | + $log .= "<li>lösche Datei $file : "; | |
558 | + $success = unlink($file); | |
559 | + } else if (is_dir($file)) | |
560 | + { | |
561 | + $log .= "<li>lösche Verzeichnis $file : "; | |
562 | + | |
563 | + delTree($file); | |
564 | + if (!is_dir($file)) | |
565 | + $success = 1; | |
566 | + } | |
567 | + | |
568 | + if ($success) | |
569 | + $log .= " gelöscht.</li>"; | |
570 | + else | |
571 | + $log .= " <b style=\"color:red\">Löschen fehlgeschlagen.</b></li>"; | |
572 | + } | |
573 | + $fp = fopen($cachecleanup_file,"w"); | |
574 | + fclose($fp); | |
575 | + } | |
576 | + $log .= "\n</ul>\nCleanup beendet."; | |
577 | + ini_set($err_reporting); | |
578 | + return $log; | |
579 | +} | |
580 | + | |
581 | +function delTree($path) { | |
582 | + if (is_dir($path)) { | |
583 | + $entries = scandir($path); | |
584 | + foreach ($entries as $entry) { | |
585 | + if ($entry != '.' && $entry != '..') { | |
586 | + deltree($path.DIRECTORY_SEPARATOR.$entry); | |
587 | + } | |
588 | + } | |
589 | + rmdir($path); | |
590 | + } else { | |
591 | + unlink($path); | |
592 | + } | |
593 | +} | |
594 | + | |
595 | +?> | ... | ... |
Please
register
or
login
to post a comment