Georg Hopp 18 years ago
parent
commit
546ba2e511
  1. 5
      ajax+json/test1.html
  2. 504
      lock.php
  3. 595
      utils_cache.php

5
ajax+json/test1.html

@ -1,3 +1,5 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Meine ersten Ajax Erfahrungen</title>
@ -27,11 +29,10 @@
german_field.value = translation.german;
french_field.value = translation.french.val1;
}
break;
return true;
default:
return false;
break;
}
}

504
lock.php

@ -0,0 +1,504 @@
<?
//-------------------------------------------
//
// ocs_user_add - last update 2006-10-23
//
// based on:
//
// Adressupdate - last update wgi 2006-05-23
//
//-------------------------------------------
header("Content-Type: text/html; charset=UTF-8");
$basepath="/data/www/localhost/htdocs/inc";
include "$basepath/mkhead.php";
function load_users ()
{
$localFile = "/var/www/localhost/htdocs/osc_user_add/xfer/web-useradd";
exec ("scp webuseradd@vam-osc5:/etc/web-useradd ".$localFile." 2>&1",
$out, $ret);
if ($ret != 0)
{
print "scp returns: ".$ret."<BR>\n";
print "Output was:<BR><PRE>\n";
print_r ($out);
print "</PRE>\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."<BR>\n";
print "Output was:<BR><PRE>\n";
print_r ($out);
print "</PRE>\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."<BR>\n";
print "Output was:<BR><PRE>\n";
print_r ($out);
print "</PRE>\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."<BR>\n";
print "Output was:<BR><PRE>\n";
print_r ($out);
print "</PRE>\n";
}
exec ("rm /tmp/web-useradd 2>&1", $out, $ret);
}
function show_users ($users)
{
print "<H1>User auf vam-osc5 und vam-osc6</H1>\n";
if ($_SESSION['editable'] == TRUE)
{
print "<A href=\"".$SCRIPT_NAME."?action=add\">";
print "Benutzer hinzufügen</A>";
}
else
{
print "<A href=\"".$SCRIPT_NAME."?action=startedit\">";
print "Benutzer bearbeiten</A>";
}
print "<TABLE border=\"0\">";
$rownum = 0;
if (isset ($users))
{
foreach ($users as $name => $data)
{
if (($rownum % 2) != 0)
{
$bg="#EEEEEE"; // leight
}
else
{
$bg="#CCCCCC"; // dark
}
$tdStyle = "";
$delText = "l&ouml;schen";
if ($data[3] == "delete")
{
$tdStyle = "style=\"text-decoration: line-through;\"";
$delText = "nicht l&ouml;schen";
}
print "<TR><TD width=70 bgcolor=".$bg." ".$tdStyle.">".$name."</TD>";
print "<TD width=150 bgcolor=".$bg." ".$tdStyle.">".$data[1]."</TD>";
print "<TD width=50 bgcolor=".$bg." ".$tdStyle.">".$data[2]."</TD>";
if ($_SESSION['editable'] == TRUE)
{
if ($data[3] != "delete")
{
print "<TD><A href=\"";
print $SCRIPT_NAME."?action=edit&name=".$name."\">";
print "bearbeiten</A></TD>";
print "<TD><A href=\"";
}
else
print "<TD colspan=2><A href=\"";
print $SCRIPT_NAME."?action=delete&name=".$name."\">";
print $delText."</A></TD>";
}
print "</TR>\n";
$rownum ++;
}
}
if ($_SESSION['editable'] == TRUE)
{
print "<TR><TD colspan=\"3\">";
print "<A href=\"".$SCRIPT_NAME."?action=update\">abschicken</A>";
print "&nbsp;<A href=\"".$SCRIPT_NAME."?action=abort\">abbrechen</A>";
print "</TD></TR>";
}
print "</TABLE>\n";
}
function edit_user ($users, $cats, $name)
{
print "<FORM action=\"".$SCRIPT_NAME."?".strip_tags (SID)."\">";
print "<INPUT type=\"HIDDEN\" name=\"action\" value=\"set\">";
print "<INPUT type=\"HIDDEN\" name=\"oldpass\" value=\"".$users[$name][0]."\">";
print "<TABLE border=\"0\">";
print "<TR><TD>Username: </TD>";
print "<TD width=\"300\">";
if (! isset ($name))
{
print "<INPUT type=\"text\" name=\"name\" value=\"".$name."\"></TD>";
}
else
{
print "<INPUT type=\"hidden\" name=\"name\" value=\"".$name."\">";
print $name."</TD>";
}
print "</TR>\n";
print "<TR><TD>Rubrik: </TD>";
print "<TD width=\"300\">";
print "<SELECT name=\"cat\" size=\"1\">";
foreach ($cats as $cat)
{
print "<OPTION";
if ($users[$name][2] == $cat)
print " SELECTED>";
else
print ">";
print $cat."</OPTION>";
}
print "</SELECT>";
print "</TD>";
print "</TR>\n";
print "<TR><TD>Vollst&auml;ndiger Name: </TD>";
print "<TD width=\"300\">";
print "<INPUT type=\"text\" name=\"full\" value=\"".$users[$name][1]."\">";
print "</TD>";
print "</TR>\n";
print "<TR><TD>Passwort: </TD>";
print "<TD width=\"300\">";
print "<INPUT type=\"password\" name=\"pass\" value=\"".$users[$name][0]."\">";
print "</TD>";
print "</TR>\n";
print "<TR><TD colspan=\"2\" align=\"right\">";
print "<A href=\"".$SCRIPT_NAME."?action=show\">abbrechen</A>";
print "&nbsp;<INPUT type=\"submit\" value=\"abschicken\">";
print "</TABLE>\n";
print "</FORM>";
}
/*
* 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 "<TABLE BGCOLOR=\"yellow\"><TR><TD>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.</TD></TR></TABLE>";
}
else
{
print "<TABLE BGCOLOR=\"yellow\"><TR><TD>Ihre Sperre ist ";
print "ung&uuml;ltig. Vermutlich haben Sie l&auml;nger als f&uuml;nf ";
print "Minuten keine Modifikationen vorgenommen und jemand ";
print "anderes bearbeitet jetzt Benutzerdaten. Leider sind ihre ";
print "bisherigen &Auml;nderungen dadurch ung&uuml;ltig geworden. ";
print "Bitte versuchen Sie es in ein paar Minuten noch einmal.";
print "</TD></TR></TABLE>";
}
}
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 "<TABLE><TR><TD bgcolor=\"yellow\">Daten wurden aktualisiert. ";
print "Es kann einige Minuten dauern bis das System die ";
print "&Auml;nderung &uuml;bernimmt.</TD></TR></TABLE>\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']);
}
}
?>
</td>
</tr>
<tr>
</tr>
</table>
<PRE>
</PRE>
</body>
</html>

595
utils_cache.php

@ -0,0 +1,595 @@
<?php
/**
* Mit der Funktion printCachedPage kann ein Script/Modul seinen dynamisch
* erzeugten HTML-Inhalt cachen und als statisches HTML einbinden. Die
* erzeugten HTML-Dateien liegen unter CACHEDIR/<subclientid>/<script-path>/
* <scriptname>?md5(<request-parameter-liste>).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 "<br />PHP_SELF wurde gesetzt: " . $_SERVER["PHP_SELF"];
// --- END DEBUG OUTPUT ---
}
return 0;
}
// --- DEBUG OUTPUT -------
$t1 = NULL;
if ($debug)
$t1 = getMilliSeconds ();
if ($debug)
{
echo "<br />Startzeit: ".strftime("%H:%M:%S");
echo "<br />Script-Datei: ".$script_file;
echo "<br />PHP_SELF: ".$_SERVER["PHP_SELF"];
echo "<br />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 "<br>DOCUMENT ROOT: " . $_SERVER["DOCUMENT_ROOT"];
if ($debug)
echo "<br />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 "<br />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 "<br />Cache-Datei: $cache_file";
echo "<br />Script-Datei: $script_file";
echo "<br />URL: ".htmlspecialchars($url);
echo "<br />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 "<br />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 "<br />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 "<br />Cache-Datei wurde erzeugt, " .
"weil diese nicht existierte.";
// --- END DEBUG OUTPUT ---
}
else
{
// --- DEBUG OUTPUT -------
if ($debug)
{
echo "<br />Es sind mehr Dateien im Cacheverzeichnis als " .
"erlaubt: " . $file_count .
"<br />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 "<br />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 "<br />Untersuche Abhängigkeiten von $inc";
// --- END DEBUG OUTPUT ---
if (filemtime($inc) > filemtime($cache_file))
{
$do_update=1;
// --- DEBUG OUTPUT -------
if ($debug)
echo "<br />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 "<br />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 "<br />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 "<br />Cache-Datei wurde erzeugt: Interval-Update";
// --- END DEBUG OUTPUT ---
}
else
{
$content = getCacheContent($cache_file, $debug);
}
}
}
// --- DEBUG OUTPUT -------
if ($debug)
echo "<hr />";
// --- END DEBUG OUTPUT ---
if (!empty($content))
echo "\n<!-- Cache-Bereich Anfang: ".basename($script_name)." -->\n";
echo $content;
if (!empty($content))
echo "\n<!-- Cache-Bereich Ende: ".basename($script_name)." -->\n";
// --- DEBUG OUTPUT -------
if ($debug)
echo "<hr /><p />Gecachter Content wurde ausgeliefert.";
if ($debug)
echo "<br />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 "<br />Encoded URL: $url";
// --- DEBUG OUTPUT -------
$t1 = '';
if ($debug)
$t1=getMilliSeconds();
// --- END DEBUG OUTPUT ---
$content = file_get_contents($url);
// --- DEBUG OUTPUT -------
if ($debug)
echo "<br />Laden der Seite ohne Cache dauerte: " .
getMilliSeconds() - $t1 . " ms";
flush();
if ($debug)
{
echo "<br />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 "<br />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 "<br />Test sleep ... $x";
// flush();
// sleep(1);
// }
fclose($fp);
chmod($cache_file,0777);
}
} else
if ($debug)
echo "<br />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 "<br />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 = "<h3>Cleanup Cache Script</h3>\n<ul>";
$def_vars = get_defined_constants();
if (!array_key_exists('CACHE_CLEANUP_TIME',$def_vars))
{
$log .= "<li>Konstante CACHE_CLEANUP_TIME ist nicht definiert - breche Cleanup-Skript ab.</li></ul>";
return $log;
} else if (!array_key_exists('CACHECLEANUPFILE',$def_vars))
{
$log .= "<li>Konstante CACHECLEANUPFILE ist nicht definiert - breche Cleanup-Skript ab.</li></ul>";
return $log;
} else
if (!preg_match("/^([0-9][0-9]:[0-9][0-9],{0,1})*$/",CACHE_CLEANUP_TIME))
{
$log .= "<li>Konstante CACHE_CLEANUP_TIME '".CACHE_CLEANUP_TIME."' ist im falschen Format - breche Cleanup-Skript ab.</li></ul>";
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 .= "<li>Cache-Cleanup-Datei $cachecleanup_file existiert.</li>";
$log .= "<li>Cache-Cleanup-Datei $cachecleanup_file wurde letzmals aktualisiert am: ".strftime("%d.%m.%Y %H:%M:%S",$lastmodified)." Uhr</li>";
}
else
$lastmodified = -1;
$cleanuptime_arr = explode(",",CACHE_CLEANUP_TIME);
foreach($cleanuptime_arr as $cleanup_time)
{
$log .= "<li><b>Checke Cleanup-Time $cleanup_time Uhr</b><ul>";
$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 .= "<li>Untersuche Differenz: now()-$cleanup_time=$diff1 Sekunden</li>";
if ($diff1>0)
{
$log .= "<li>Cleanup-Zeitpunkt ist überschritten</li>";
if ($cleanup_timestamp>$lastmodified)
{
$cleanup=1;
$log .= "<li>Cleanup-Zeitpunkt muss durchgeführt werden.</li>";
} else
$log .= "<li>Kein Cleanup erforderlich, weil ".basename($cachecleanup_file)." nach der Cleanup-Zeit" .
" $cleanup_time Uhr verändert wurde.";
} else
$log .= "<li>Kein Cleanup erforderlich. Es dauert noch ".(-$diff1)." Sekunden bis zum nächsten Cleanup.</li>";
}
$log .= "</ul></li>";
}
if ($cleanup)
{
$log .= "<li><b>Führe jetzt Cleanup durch ...</b>";
$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 .= "<li>Cache ist leer.</li>";
foreach($files as $file)
{
$file = realpath(CACHEDIR.$file);
$success = 0;
if (is_file($file))
{
$log .= "<li>lösche Datei $file : ";
$success = unlink($file);
} else if (is_dir($file))
{
$log .= "<li>lösche Verzeichnis $file : ";
delTree($file);
if (!is_dir($file))
$success = 1;
}
if ($success)
$log .= " gelöscht.</li>";
else
$log .= " <b style=\"color:red\">Löschen fehlgeschlagen.</b></li>";
}
$fp = fopen($cachecleanup_file,"w");
fclose($fp);
}
$log .= "\n</ul>\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);
}
}
?>
Loading…
Cancel
Save