From 546ba2e5113880d78e2b226ab40e2aa7449d79e6 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Fri, 12 Oct 2007 12:53:57 +0000 Subject: [PATCH] --- ajax+json/test1.html | 5 +- lock.php | 504 ++++++++++++++++++++++++++++++++++++ utils_cache.php | 595 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1102 insertions(+), 2 deletions(-) create mode 100644 lock.php create mode 100644 utils_cache.php diff --git a/ajax+json/test1.html b/ajax+json/test1.html index 3bf7f8f..55f5d22 100644 --- a/ajax+json/test1.html +++ b/ajax+json/test1.html @@ -1,3 +1,5 @@ + Meine ersten Ajax Erfahrungen @@ -27,11 +29,10 @@ german_field.value = translation.german; french_field.value = translation.french.val1; } - break; + return true; default: return false; - break; } } diff --git a/lock.php b/lock.php new file mode 100644 index 0000000..02dbc48 --- /dev/null +++ b/lock.php @@ -0,0 +1,504 @@ +&1", + $out, $ret); + + if ($ret != 0) + { + print "scp returns: ".$ret."
\n"; + print "Output was:
\n";
+
+		print_r ($out);
+
+		print "
\n"; + } + else + { + $fh = fopen ($localFile, "r"); + + $line = fgets ($fh); + while (! feof ($fh)) + { + $buf = explode (":", trim ($line)); + if ($buf[1] == "") + $buf[1] = "no-change"; + if ($buf[4] != "delete") + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); + + $line = fgets ($fh); + } + + fclose ($fh); + } + + exec ("scp webuseradd@vam-osc6:/etc/web-useradd ".$localFile." 2>&1", + $out, $ret); + + if ($ret != 0) + { + print "scp returns: ".$ret."
\n"; + print "Output was:
\n";
+
+		print_r ($out);
+
+		print "
\n"; + } + else + { + $fh = fopen ($localFile, "r"); + + $line = fgets ($fh); + while (! feof ($fh)) + { + $buf = explode (":", trim ($line)); + if ($buf[1] == "") + if ($users[$buf[0]] && $users[$buf[0]][0] != "") + $buf[1] = $users[$buf[0]][0]; + else + $buf[1] = "no-change"; + if ($buf[4] != "delete") + $users[$buf[0]] = array ($buf[1], $buf[2], $buf[3], $buf[4]); + + $line = fgets ($fh); + } + + fclose ($fh); + } + + exec ("rm ".$localFile." 2>&1", $out, $ret); + + return $users; +} + +function load_cats () +{ + /* + * OK, ich hole dir verfügbaren Rubriken anhand der existierenden + * Verzeichniss unter /vol1/www/bhi_upload. Will man also eine + * Rubrik hinzufügen, so muß man dort nur das Verzeichnis anlegen. + */ + exec ("ssh -l webuseradd vam-osc5 ". + "\"ls -p /vol1/www/bhi_upload | sed '/\/$/p;d'\" ". + "2>/dev/null", + $out, $ret); + + foreach ($out as $key=>$line) + $out[$key] = preg_replace ("/^(.*)\/$/", "\\1", $line); + + return $out; + /* return array ("kfz", "immo", "trauer"); */ +} + +function update_users ($users) +{ + $fh = fopen ("/tmp/web-useradd", "w"); + + foreach ($users as $key => $value) + { + fputs ($fh, $key.":".$value[0].":".$value[1].":". + $value[2].":".$value[3]."\n"); + } + + fclose ($fh); + + exec ("scp /tmp/web-useradd webuseradd@vam-osc5:/etc/web-useradd 2>&1", + $out, $ret); + + if ($ret != 0) + { + print "scp to vam-osc5 returns: ".$ret."
\n"; + print "Output was:
\n";
+
+		print_r ($out);
+
+		print "
\n"; + } + + exec ("scp /tmp/web-useradd webuseradd@vam-osc6:/etc/web-useradd 2>&1", + $out, $ret); + + if ($ret != 0) + { + print "scp to vam-osc6 returns: ".$ret."
\n"; + print "Output was:
\n";
+
+		print_r ($out);
+
+		print "
\n"; + } + + exec ("rm /tmp/web-useradd 2>&1", $out, $ret); +} + + +function show_users ($users) +{ + print "

User auf vam-osc5 und vam-osc6

\n"; + + if ($_SESSION['editable'] == TRUE) + { + print ""; + print "Benutzer hinzufügen"; + } + else + { + print ""; + print "Benutzer bearbeiten"; + } + + print ""; + + $rownum = 0; + + if (isset ($users)) + { + foreach ($users as $name => $data) + { + if (($rownum % 2) != 0) + { + $bg="#EEEEEE"; // leight + } + else + { + $bg="#CCCCCC"; // dark + } + + $tdStyle = ""; + $delText = "löschen"; + + if ($data[3] == "delete") + { + $tdStyle = "style=\"text-decoration: line-through;\""; + $delText = "nicht löschen"; + } + + print ""; + print ""; + print ""; + if ($_SESSION['editable'] == TRUE) + { + if ($data[3] != "delete") + { + print ""; + print ""; + } + print "\n"; + + $rownum ++; + } + } + + if ($_SESSION['editable'] == TRUE) + { + print ""; + } + print "
".$name."".$data[1]."".$data[2].""; + print "bearbeiten"; + print $delText."
"; + print "abschicken"; + print " abbrechen"; + print "
\n"; +} + +function edit_user ($users, $cats, $name) +{ + print "
"; + print ""; + print ""; + print ""; + print ""; + print ""; + } + else + { + print ""; + print $name.""; + } + + print "\n"; + print ""; + print ""; + print "\n"; + print ""; + print ""; + print "\n"; + print ""; + print ""; + print "\n"; + print "
Username: "; + + if (! isset ($name)) + { + print "
Rubrik: "; + print ""; + print "
Vollständiger Name: "; + print ""; + print "
Passwort: "; + print ""; + print "
"; + print "abbrechen"; + print " "; + print "
\n"; + print "
"; +} + +/* + * gibt FALSE zurück falls kein Lock gesetzt werden konnte, ansonsten die + * aktuelle lockid. Diese wird bei free_lock benötigt um den lock wieder + * freizugeben. + * Folgende Fälle können eintreten: + * 1. Das Lockfile enthält keine Daten und myId ist leer. + * Das bedeutet: es existiert keine Sperre auf die Daten und wir hatten + * bisher keine Sperre auf die Daten. + * Daraufhin wird eine neue lock-id generiert und zusammen mit dem + * aktuellen Timestamp in das lockfile gegeben. Die generierte lock-id + * wird zurückgegeben. + * 2. Das Lockfile enthält eine Sperre und myId ist leer. + * Das bedeutet: es existiert eine Sperre auf die Daten, die nicht von + * dieser PHP session generiert wurde. + * 2 Faelle: + * (lockTime + 300) >= time (): Die Sperre ist nicht abgelaufen => es + * kann keine neue Sperre angelegt werden. + * (lockTime + 300) < time (): Die Sperre ist abgelaufen => neue lock-id + * generieren, in Datei eintragen und + * zurückgeben. + * 3. Das Lockfile enthält eine Sperre und myId != lockId. + * Das bedeutet: In der aktuellen PHP session wurde erfolgreich eine + * Sperre erzeugt, die aber aufgrund dessen das ein timeout + * eingetreten ist (d.h. in der aktuellen Session wurde länger + * als 5 Minuten auf keinen link mehr geklickt.) nicht mehr + * gültig war und in der zwischenzeit hat jemand anderes + * daher eine neue Sperre auf die Daten eingerichtet siehe 2. + * folgende Fälle: + * die 2 Unterfälle von 2. + * 4. Das Lockfile enthält keine Daten, aber myId ist nicht leer. + * Das bedeutet: In der aktuellen PHP session wurde ein lock eingerichtet. + * Der Timeout verstrich und jemand anderes hat änderungen + * an den Daten vorgenommen. Konsequenz: Die Daten in dieser + * PHP session sind nicht mehr aktuell. + * Da der aktuelle Lock daher komplett ungültig geworden ist wird nichts + * in die Datei eingetragen und eine leere lock-id zurückgegeben. + * An anderer Stelle (check_lock) werden anhand der Information das myId + * nich leer war, aber die zurückgegebene id leer ist alle anderen Daten + * neu initialisiert. + * 5. Das Lockfile enthält eine Sperre und myId == lockId. + * Das bedeutet: Innerhalb dieser PHP session wurde eine Sperre eingerichtet + * die auch weiterhin gültig ist. + * Die lockTime wird in der Datei aktualisiert und lockId zurückgegeben. + */ +function get_lock ($lockFile, $myId) +{ + $newId = ""; + + $lockFd = fopen ($lockFile, "a+"); + if ($lockFd != FALSE) + { + if (flock ($lockFd, LOCK_EX) != FALSE) + { + rewind ($lockFd); + $lockEntry = explode ('/', trim (fgets ($lockFd))); + $lockId = $lockEntry[0]; + $lockTime = $lockEntry[1]; + + if ($lockId == $myId || + /* lockTime nur pruefen wenn Sie in der Datei stand */ + ($lockTime != "" && ($lockTime + 300) < time ())) + { + ftruncate ($lockFd, 0); + if ($lockId != "" && $lockId == $myId) + $newId = $myId; + else + $newId = uniqid (); + fputs ($lockFd, $newId."/".time ()."\n"); + } + + fclose ($lockFd); + } + } + + return $newId; +} + +function free_lock ($lockFile, $lockId) +{ + $lockFd = fopen ($lockFile, "r+"); + if ($lockFd != FALSE) + { + if (flock ($lockFd, LOCK_EX) != FALSE) + { + $lockEntry = explode ('/', trim (fgets ($lockFd))); + $oldId = $lockEntry[0]; + + if ($lockId == $oldId) + ftruncate ($lockFd, 0); + + fclose ($lockFd); + } + } +} + +function check_lock ($lockFile, $lockId) +{ + if ($_SESSION['editable'] == TRUE) + { + $gotId = get_lock ($lockFile, $lockId); + + if ($gotId == FALSE) + { + if ($lockId == FALSE) + { + print "
Konnte keine Sperre zum "; + print "bearbeiten der Benutzerdaten anlegen. Jemand anderes "; + print "bearbeitet die Daten bereits. Bitte versuchen Sie es in ein "; + print "paar Minuten noch einmal.
"; + } + else + { + print "
Ihre Sperre ist "; + print "ungültig. Vermutlich haben Sie länger als fünf "; + print "Minuten keine Modifikationen vorgenommen und jemand "; + print "anderes bearbeitet jetzt Benutzerdaten. Leider sind ihre "; + print "bisherigen Änderungen dadurch ungültig geworden. "; + print "Bitte versuchen Sie es in ein paar Minuten noch einmal."; + print "
"; + } + } + + return $gotId; + } + + return ""; +} + + + + +$_action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'load'; + +session_start (); + +$_SESSION['lockFile'] = + '/var/www/localhost/htdocs/osc_user_add/webuseradd.lck'; + +mkhead ("Benutzer auf vam-osc5 und vam-osc6 anlegen ...", + "bar-edvtools", + "Benutzertool vam-osc5 und vam-osc6"); + +if ($_action == "load" || $_action == "startedit") +{ + session_unregister ("users"); + session_unregister ("cats"); +} + +if (! isset ($_SESSION['users'])) + $_SESSION['users'] = load_users (); + +if (! isset ($_SESSION['cats'])) + $_SESSION['cats'] = load_cats (); + +if (! isset ($_SESSION['editable'])) + $_SESSION['editable'] = FALSE; + +if ($_action == 'startedit') + $_SESSION['editable'] = TRUE; + +$_SESSION['lockId'] = check_lock ($_SESSION['lockFile'], $_SESSION['lockId']); +if ($_SESSION['lockId'] == FALSE) +{ + $_SESSION['editable'] = FALSE; + + show_users ($_SESSION['users']); +} +else +{ + switch ($_action) + { + case 'edit': + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); + break; + case 'set': + $pass = $_REQUEST['pass']=="no-change"?$_REQUEST['pass']: + $_REQUEST['oldpass']==$_REQUEST['pass']?$_REQUEST['pass']: + crypt ($_REQUEST['pass'], $_REQUEST['name']); + + $_SESSION['users'][$_REQUEST['name']] = + array ($pass, + $_REQUEST['full'], + $_REQUEST['cat'], + time ()); + show_users ($_SESSION['users']); + break; + case 'update': + update_users ($_SESSION['users']); + print "
Daten wurden aktualisiert. "; + print "Es kann einige Minuten dauern bis das System die "; + print "Änderung übernimmt.
\n"; + case 'abort': + free_lock ($_SESSION['lockFile'], $_SESSION['lockId']); + $_SESSION['lockId'] = ""; + $_SESSION['editable'] = FALSE; + show_users ($_SESSION['users']); + break; + case 'add': + edit_user ($_SESSION['users'], $_SESSION['cats'], $_REQUEST['name']); + break; + case 'delete': + if ($_SESSION['users'][$_REQUEST['name']][3] != "delete") + $_SESSION['users'][$_REQUEST['name']][3] = "delete"; + else + $_SESSION['users'][$_REQUEST['name']][3] = time (); + show_users ($_SESSION['users']); + break; + case 'show': + default: + show_users ($_SESSION['users']); + } +} +?> + + + + + +
+
+ + diff --git a/utils_cache.php b/utils_cache.php new file mode 100644 index 0000000..af265de --- /dev/null +++ b/utils_cache.php @@ -0,0 +1,595 @@ +// + * ?md5().html + * + * Es wird für jede Seite und jeden Request-Parameter-Kombination, der in + * $allowed_req_params angegeben ist, eine Seite im Cache angelegt. + * + * Parameter: + * - $auto_update: erzeugt bei Scriptaufruf eine neue Cache-Datei, wenn: + * a) die Cachedatei älter ist als die Scriptdatei oder + * b) die Cachedatei älter ist als eine per include/require eingebunden + * Scriptdatei + * - $update_interval: eine Erneuerung der Cachedatei wird vorgenommen, wenn + * die Cachedatei älter als $update_interval ist. + * - $script-file: das Script, dessen Inhalt gecached werden soll, i.d.R + * __FILE__ + * - $allowed_req_params: Liste der erlaubten Request-Parameter, dient zur + * Bildung des Cachedateinamens + * - $debug: erzeugt Debug-Ausgaben + * + * Die Einbindung in ein Script erfolgt nach Einbindung per include/require + * der zusätzlich erforderlichen Bibliothen mit: + * + * if (printCachedPage($auto_update,$update_interval,__FILE__)) + * return; + * + * Der mit printCachedPage erzeugte HTML-Bereich wird mit HTML-Kommentaren + * umrandet und kann so im Gesamt-Quelltext identifiziert werden. + */ + +define ('MAX_CACHE_WAIT_SECS',1); + +function printCachedPage ( + $script_file, + $auto_update = true, + $update_interval = 86400, + $allowed_req_params = -1, + $debug = 0) +{ + if (USE_SCRIPT_CACHE == 0) + return 0; + + $em_parameter = ""; + if (isset ($_REQUEST["em_parameter"])) + $em_parameter = $_REQUEST["em_parameter"]; + if (!empty($em_parameter)) + $GLOBALS["em_parameter"] = $em_parameter; + if (!empty($GLOBALS["em_parameter"])) + $em_parameter = $GLOBALS["em_parameter"]; + + $content = ""; + if (isset($_REQUEST["NOCACHE"])) + { + if (isset($_REQUEST["PHP_SELF"])) + { + $_SERVER["PHP_SELF"]=$_REQUEST["PHP_SELF"]; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
PHP_SELF wurde gesetzt: " . $_SERVER["PHP_SELF"]; + // --- END DEBUG OUTPUT --- + + } + return 0; + } + + // --- DEBUG OUTPUT ------- + $t1 = NULL; + + if ($debug) + $t1 = getMilliSeconds (); + + if ($debug) + { + echo "
Startzeit: ".strftime("%H:%M:%S"); + echo "
Script-Datei: ".$script_file; + echo "
PHP_SELF: ".$_SERVER["PHP_SELF"]; + echo "
Erlaubte Cache-Dateien pro Verzeichnis: " . + MAX_FILES_IN_CACHE_DIR; + } + // --- END DEBUG OUTPUT --- + + $subclient_id = getSubclientIDByUrl(); + + $len = strlen ($_SERVER["DOCUMENT_ROOT"]); + $script_name = substr ($script_file, $len); + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
DOCUMENT ROOT: " . $_SERVER["DOCUMENT_ROOT"]; + + if ($debug) + echo "
Script-Name: $script_name"; + // --- END DEBUG OUTPUT --- + + $cache_file = realpath (CACHEDIR) . "/" . $subclient_id . "/" . + substr(dirname($script_name),1) . "/" . basename($script_name) . "/" . + basename($script_name,".php"); + + $params = ""; + $query_string = ""; + + foreach ($_REQUEST as $key => $val) + { + if (is_array ($allowed_req_params) && + in_array ($key,$allowed_req_params)) + { + $val = urlencode (trim($val)); + $key = urlencode (trim($key)); + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Hänge Request-Parameter an: _$key-$val"; + // --- END DEBUG OUTPUT --- + + $params .= "_". $key . "-" . $val; + $query_string .= $key . "=" . $val . "&"; + } + } + + if (!empty ($em_parameter)) + { + $params .= "_" . $em_parameter; + $query_string .= "em_parameter=" . $em_parameter; + } + + if (!empty ($params)) + $cache_file = $cache_file . "_" . md5($params) . ".html"; + else + $cache_file = $cache_file . ".html"; + + $url = getProtocol () . "://" . $_SERVER["SERVER_NAME"] . $script_name . + "?" . $query_string; + $cached_dir = dirname($cache_file); + + // --- DEBUG OUTPUT ------- + if ($debug) + { + echo "
Cache-Datei: $cache_file"; + echo "
Script-Datei: $script_file"; + echo "
URL: ".htmlspecialchars($url); + echo "
Cache Dir: $cached_dir"; + } + // --- END DEBUG OUTPUT --- + + if (!is_dir ($cached_dir)) + { + if (!is_dir (CACHEDIR . $subclient_id)) + mkdir (CACHEDIR . $subclient_id); + $cachedir = CACHEDIR . $subclient_id; + + $dir_arr = explode ("/", dirname($script_name) . "/" . + basename($script_name)); + + foreach ($dir_arr as $dir) + { + if (!is_dir($cachedir . "/" . $dir)) + { + mkdir ($cachedir. "/" . $dir); + chmod ($cachedir. "/" . $dir, 0777); + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Erzeuge Verzeichnis: $cachedir/$dir"; + // --- END DEBUG OUTPUT --- + } + $cachedir .= "/" . $dir; + } + } + + $is_updated = 0; + if (!file_exists ($cache_file)) + { + $file_count = count (scandir ($cached_dir)) - 2; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Es sind $file_count im Cacheverzeichnis. " . + "Erlaubt sind " . MAX_FILES_IN_CACHE_DIR. "."; + // --- END DEBUG OUTPUT --- + + if ($file_count <= MAX_FILES_IN_CACHE_DIR) + { + $content = makeCacheFile ($cache_file, $url, $debug); + $is_updated = 1; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Cache-Datei wurde erzeugt, " . + "weil diese nicht existierte."; + // --- END DEBUG OUTPUT --- + } + else + { + // --- DEBUG OUTPUT ------- + if ($debug) + { + echo "
Es sind mehr Dateien im Cacheverzeichnis als " . + "erlaubt: " . $file_count . + "
Die Seite kann daher nicht gecached werden."; + } + // --- END DEBUG OUTPUT --- + } + } + else + { + if ($auto_update) + { + $do_update=0; + + if (filemtime($cache_file) < filemtime($script_file)) + { + $do_update = 1; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Cache-Datei wird erzeugt, weil die Cache-Datei " . + "älter als die Script-Datei ist."; + // --- END DEBUG OUTPUT --- + } + else + { + $includes = get_included_files (); + + foreach($includes as $inc) + { + if (strstr ($inc, realpath (HOME . "/../"))) + { + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Untersuche Abhängigkeiten von $inc"; + // --- END DEBUG OUTPUT --- + + if (filemtime($inc) > filemtime($cache_file)) + { + $do_update=1; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Cache-Datei wird erzeugt, weil " . + $inc . "verändert wurde."; + // --- END DEBUG OUTPUT --- + + break; + } + } + } + } + + if (!$do_update) + { + $content = getCacheContent ($cache_file, $debug); + } + else + { + $content = makeCacheFile ($cache_file, $url, $debug); + $is_updated = 1; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Cache-Datei wurde erzeugt: Auto-Update"; + // --- END DEBUG OUTPUT --- + } + } + + if ($update_interval >= 10 && !$is_updated) + { + $diff = time() - filemtime($cache_file); + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Noch " . $update_interval - $diff . + " Sekunden bis zum nächsten Interval-Update"; + // --- END DEBUG OUTPUT --- + + if ($diff > $update_interval) + { + $content = makeCacheFile($cache_file, $url, $debug); + $is_updated=1; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Cache-Datei wurde erzeugt: Interval-Update"; + // --- END DEBUG OUTPUT --- + } + else + { + $content = getCacheContent($cache_file, $debug); + } + } + } + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
"; + // --- END DEBUG OUTPUT --- + + if (!empty($content)) + echo "\n\n"; + echo $content; + if (!empty($content)) + echo "\n\n"; + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "

Gecachter Content wurde ausgeliefert."; + if ($debug) + echo "
Verarbeitungsdauer (in ms): ".(intval(getMilliSeconds()-$t1)); + // --- END DEBUG OUTPUT --- + + if (empty($content)) + return 0; + else + return 1; +} + +function makeCacheFile($cache_file, $url, $debug) +{ + if (preg_match("/^http.*\?.*/",$url)) + $url = $url."&NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]); + else + $url = $url."?NOCACHE=1&PHP_SELF=".urlencode($_SERVER["PHP_SELF"]); + + if ($debug) + echo "
Encoded URL: $url"; + + // --- DEBUG OUTPUT ------- + $t1 = ''; + if ($debug) + $t1=getMilliSeconds(); + // --- END DEBUG OUTPUT --- + + $content = file_get_contents($url); + + // --- DEBUG OUTPUT ------- + if ($debug) + echo "
Laden der Seite ohne Cache dauerte: " . + getMilliSeconds() - $t1 . " ms"; + flush(); + + if ($debug) + { + echo "
Cache-Datei ist gesperrt: "; + var_dump (is_file ($cache_file.".LCK")); + } + // --- END DEBUG OUTPUT --- + + $ctr = 0; + while (cacheFileIsLocked ($cache_file)) + { + usleep (100000); + $ctr++; + if ($debug) + { + echo "
Cache-Datei ist gesperrt ..."; + flush(); + } + if ($ctr>(MAX_CACHE_WAIT_SECS*10)) + return $content; + clearstatcache(); + } + $is_locked = lockCacheFile($cache_file); + if ($is_locked) + { + $fp = fopen($cache_file, "w"); + if ($fp) + { + fwrite($fp,$content); + + // for ($x=0;$x<25;$x++) + // { + // echo "
Test sleep ... $x"; + // flush(); + // sleep(1); + // } + + fclose($fp); + chmod($cache_file,0777); + } + } else + if ($debug) + echo "
Cache-Datei konnte nicht geschrieben werden, " . + "weil die Lock-Datei nicht gesperrt werden konnte"; + if ($is_locked) + unlockCacheFile($cache_file); + return $content; +} + +function lockCacheFile($cache_file) +{ + $lock_file = $cache_file.".LCK"; + if (is_file($lock_file)) + { + if (is_writable($lock_file)) + { + chmod($lock_file,0555); + clearstatcache(); + return 1; + } + else + return 0; + } else + { + $fp = fopen($lock_file,'w'); + if ($fp) + { + fclose($fp); + chmod($lock_file,0555); + clearstatcache(); + return 1; + } else + return 0; + } +} + +function unlockCacheFile($cache_file) +{ + $lock_file = $cache_file.".LCK"; + chmod($lock_file,0777); + if (is_file($lock_file)) + { + unlink($lock_file); + clearstatcache(); + } +} + +function cacheFileIsLocked($cache_file) +{ + $lock_file = $cache_file.".LCK"; + $is_locked = is_file($lock_file); + + if ($is_locked) + return 1; + return 0; +} + +function getProtocol() +{ + $proto = $_SERVER["SERVER_PROTOCOL"]; + if (preg_match("/^HTTP\/.*$/",$proto)) + return 'http'; + if (preg_match("/^HTTPS\/.*$/",$proto)) + return 'https'; +} + +function getCacheContent($cache_file, $debug) +{ + $ctr = 0; + while (cacheFileIsLocked($cache_file)) + { + usleep(100000); + $ctr++; + if ($debug) + { + echo "
Kann Content nicht ausliefern, da Cache-Datei gesperrt ist ..."; + flush(); + } + if ($ctr>(MAX_CACHE_WAIT_SECS*10)) + return ""; + clearstatcache(); + } + return file_get_contents($cache_file); +} + +function cleanupCache() +{ + $log = "

Cleanup Cache Script

\n
    "; + $def_vars = get_defined_constants(); + + if (!array_key_exists('CACHE_CLEANUP_TIME',$def_vars)) + { + $log .= "
  • Konstante CACHE_CLEANUP_TIME ist nicht definiert - breche Cleanup-Skript ab.
"; + return $log; + } else if (!array_key_exists('CACHECLEANUPFILE',$def_vars)) + { + $log .= "
  • Konstante CACHECLEANUPFILE ist nicht definiert - breche Cleanup-Skript ab.
  • "; + return $log; + } else + if (!preg_match("/^([0-9][0-9]:[0-9][0-9],{0,1})*$/",CACHE_CLEANUP_TIME)) + { + $log .= "
  • Konstante CACHE_CLEANUP_TIME '".CACHE_CLEANUP_TIME."' ist im falschen Format - breche Cleanup-Skript ab.
  • "; + return $log; + } + + $cachecleanup_file = CACHEDIR.CACHECLEANUPFILE; + $cleanup = 0; + $err_reporting = ini_get("error_reporting"); + ini_set("error_reporting",0); + + if (file_exists($cachecleanup_file)) + { + $lastmodified = filemtime($cachecleanup_file); + $cachecleanup_file = realpath($cachecleanup_file); + $log .= "
  • Cache-Cleanup-Datei $cachecleanup_file existiert.
  • "; + $log .= "
  • Cache-Cleanup-Datei $cachecleanup_file wurde letzmals aktualisiert am: ".strftime("%d.%m.%Y %H:%M:%S",$lastmodified)." Uhr
  • "; + + } + else + $lastmodified = -1; + $cleanuptime_arr = explode(",",CACHE_CLEANUP_TIME); + foreach($cleanuptime_arr as $cleanup_time) + { + $log .= "
  • Checke Cleanup-Time $cleanup_time Uhr
      "; + $ct_arr = explode(":",$cleanup_time); + if (count($ct_arr)>=2) + { + $hour = $ct_arr[0]; + $minute = $ct_arr[1]; + $today = getdate(); + $cleanup_timestamp = mktime($hour,$minute,0,$today["mon"],$today["mday"],$today["year"]); + $now = time(); + $diff1 = $now-$cleanup_timestamp; + $log .= "
    • Untersuche Differenz: now()-$cleanup_time=$diff1 Sekunden
    • "; + if ($diff1>0) + { + $log .= "
    • Cleanup-Zeitpunkt ist überschritten
    • "; + if ($cleanup_timestamp>$lastmodified) + { + $cleanup=1; + $log .= "
    • Cleanup-Zeitpunkt muss durchgeführt werden.
    • "; + } else + $log .= "
    • Kein Cleanup erforderlich, weil ".basename($cachecleanup_file)." nach der Cleanup-Zeit" . + " $cleanup_time Uhr verändert wurde."; + } else + $log .= "
    • Kein Cleanup erforderlich. Es dauert noch ".(-$diff1)." Sekunden bis zum nächsten Cleanup.
    • "; + } + $log .= "
  • "; + } + + if ($cleanup) + { + $log .= "
  • Führe jetzt Cleanup durch ..."; + $files = scandir(CACHEDIR); + + foreach($files as $key=>$file) + { + if ($file=='.' || + $file=='..' || + $file=='.svn' || + $file==LASTLOGFILE || + $file==CACHECLEANUPFILE) + unset($files[$key]); + } + + if (count($files)==0) + $log .= "
  • Cache ist leer.
  • "; + foreach($files as $file) + { + $file = realpath(CACHEDIR.$file); + $success = 0; + if (is_file($file)) + { + $log .= "
  • lösche Datei $file : "; + $success = unlink($file); + } else if (is_dir($file)) + { + $log .= "
  • lösche Verzeichnis $file : "; + + delTree($file); + if (!is_dir($file)) + $success = 1; + } + + if ($success) + $log .= " gelöscht.
  • "; + else + $log .= " Löschen fehlgeschlagen."; + } + $fp = fopen($cachecleanup_file,"w"); + fclose($fp); + } + $log .= "\n\nCleanup beendet."; + ini_set($err_reporting); + return $log; +} + +function delTree($path) { + if (is_dir($path)) { + $entries = scandir($path); + foreach ($entries as $entry) { + if ($entry != '.' && $entry != '..') { + deltree($path.DIRECTORY_SEPARATOR.$entry); + } + } + rmdir($path); + } else { + unlink($path); + } +} + +?>