Bilder aus Datenbank cachen

Was oben noch fehlt:
DB-Einträge ab einem bestimmten Alter löschen (noch ein delete :D)
Muss aber nicht unbedingt bei jedem Bild rein, kann auch als Cronjob oÄ. gemacht werden.

Grund: Wenn eine Erlaubnnis gegeben wurde, die dann aber nicht verwendet wird
(wenn irgendwas beim Client spinnt, zB. Internetverbindung weg),
dann häuft sich da Müll an.

Die zu alten Einträge sollten eben auf regelmäßiger Basis weggeputzt werden.
Wenn sich das in der PHP-Datei zu sehr auf die Geschwindigkeit auswirkt: CronJob.
Oder manuell startbar. Oder...
 
Ja werd das auf jeden Fall noch so machen, doch hab ich mit dem Projekt unendlich viel mehr zu tun;) muss daher ein paar Prioritäten setzen. Werd aber definitiv einer der nächsten aufgaben sein. Muss schauen wie sich das auf die last auswirkt. Dank dir aufjeden Fall nochmal!
 
Hey sorry das ich das Thema nochmal öffnen muss, aber mir ist da was aufgefallen was nicht so optimal ist, vielleicht hat ja einer ne Idee wie man das lösen könnte.

Folgendes: Ich möchte die Bilder, die mir eine php Datei generiert cachen, funktioniert soweit 1A.
Jetzt möchte ich aber noch die php Datei, welches die Bilder generiert, vor Fremdzugriffen schützen, funkioniert auch einwandfrei, jedoch beides nur getrennt!!

Mir ist aufgefallen das die Bilder nicht mehr gecached werden. Warum? weil der Link der generiert wird am Ende einen Hash angehängt bekommt. Das Problem ist jetzt das der Browser jedes mal denkt, es sei ein neues Bild, weil ja unterschiedliche URL. Am besten ich zeigs euch mal im Code.

index.php ruft die Funktion auf:
PHP:
echo profpsize();

Die Funtkion an sich sieht so aus:
PHP:
function profpsize()
	{
		$id = mysql_real_escape_string($_GET['id']);
		$query = "	SELECT ID,width,height
				FROM blabla
				WHERE blabla  = $id AND blabla = 1
				";
					$result = mysql_query($query);
					while($row = mysql_fetch_object($result))
					{
						$pid = "$row->ID";
						$height= "$row->height";
						$width = "$row->width";
						$widtold = "$row->width";	
						$code =	md5(uniqid(mt_rand(), true));
				}

				$nid = mysql_real_escape_string($_GET['id']);
				$sql2 = "INSERT INTO profpicval
											(autcode,time, piD)
									VALUES('".$code."', '".time()."','".mysql_real_escape_string(htmlspecialchars($pid))."' )";
								  mysql_query($sql2) OR die("<pre>\n".$sql2."</pre>\n".mysql_error());	
			
						
						
						if ($width > 158) {
							$width = 158;
							$height = ($height/$widtold)*$width;
							}
						return " <img src=\"http://192.168.1.101/www.qwicon.de/php/pival/pbs.php?sid=".$code."&id=".$nid."\" width=\"".$width."\" height=\"".$height."\" border=\"0\"><br> ";
	}

Das Problem ist jetzt das die Variable code an die Url rangehangen wird. Ich weiß leider nicht wie ich sonst die Variable Code an die folgende Bild.php übergeben kann..

PHP:
<?php
include $_SERVER['DOCUMENT_ROOT'].("...mysql.php");
$sid = mysql_real_escape_string($_GET['sid']);
$query = "	SELECT pID FROM profpicval WHERE autcode  = '$sid'";
					$result = mysql_query($query);
					while($row = mysql_fetch_object($result))
					{
					$pid = "$row->pID";
					} 
// gibt es keine id script beenden, ansonsten rest ausführen und ganz unten alle daten löschen
if(!isset($pid)){
echo"<meta http-equiv=\"refresh\" content=\"0; URL=...">";
die;}

else
{
	$nid = mysql_real_escape_string($_GET[id]);
	
  	$result = mysql_query("SELECT image, mimetype,height,uploadtime FROM tabelle WHERE spalte1 = $nid AND spalte2 = 1
	");
	
 $row = mysql_fetch_object($result);
	$timestamp = $row->uploadtime;
 	$bild = $row->image;
	
	function doConditionalGet($timestamp) {
	$dauer = 525600;//ein Jahr sollte reichen
    // A PHP implementation of conditional get, see 
    //   http://fishbowl.pastiche.org/archives/001132.html
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT';
	$exp_gmt = gmdate("D, d M Y H:i:s", $timestamp + $dauer * 60) ." GMT";
    $etag = '"'.md5($last_modified).'"';
    // Send the headers
    header("Last-Modified: $last_modified");
	header("Expires: " . $exp_gmt);
    header("ETag: $etag");
	header("Content-type: $row->mimetype");
	//echo $row->image;
    // See if the client has provided the required headers
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ?
        stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) :
        false;
    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
        stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
        false;
    if (!$if_modified_since && !$if_none_match) {
        return;
    }
    // At least one of the headers is there - check them
    if ($if_none_match && $if_none_match != $etag) {
        return; // etag is there but doesn't match
    }
    if ($if_modified_since && $if_modified_since != $last_modified) {
        return; // if-modified-since is there but doesn't match
    }
    // Nothing has changed since their last request - serve a 304 and exit
    header('HTTP/1.0 304 Not Modified');
    exit;
}

echo doConditionalGet($timestamp);
echo $bild; 
$dze =time()-10;
$sql ="	DELETE FROM profpicval
		WHERE time < '$dze' ";
        mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
		
}
?>

Wie gesagt, funktioniert eigentlich auch, aber ich möchte die Variable Code anders an die Bild.php übergeben weil der Browser sonst denkt das er jedes mal ein neues Bild bekommt und deswegen den Cache mit eigentlich ein und demselben Bild zumüllt
 
Ohne den Code genauer angeschaut zu haben:
Irgendwie erscheint mir das etwas sinnlos.

Man darf das Bild also nur einmal aufrufen,
und trotzdem soll es gecacht werden, damit man es immer anschauen kann?
 
Sorry, dass ich so reinplatze, habe nicht den ganzen Thread gelesen..
:) Was heisst denn Fremdzugriff? Hotlinking?

@sheel : Einmalzugriff und Caching klingt schon sinnlos :)

mfg chmee
 
Naja, in dem Sinne darf man das Bild nicht nur einmal aufrufen.
Jedes mal wenn das Bild angefodert wird, wird ein Hash generiert. Stimmt dieser Hash mit der Abfrage aus der Bild.php überein, wird eine Bildfreigabe erteilt. (Dient zum schutz damit sich nicht jeder alle Bilder per URL eingabe anschauen kann)
Wurde die Freigabe erteilt soll entweder das Bild neu geladen werden, oder je nach abhängigkeit des Alters vom Bild, das Bild ausm Cache genommen werden.
Wie gesagt, unabhängig voneinander geht beides problemlos, aber zusammen gehts noch nicht weil in meiner Version der Hash an die Url angehangen wird und somit der Browser denkt, dass es jedes mal ein neues Bild ist.
Ich will jetzt praktisch die Variable Code nicht an die Url anhängen, sondern diese irgendwie anders zur Bild.php schicken. Irgendwie bekomm ichs aber nicht hin.
 
Müsste eigentlich, in der Bild.php wird ja die Variable Code über die die URL, also GET übernommen.
Wie kann ich ihn denn die Daten per POST schicken? Habs in der Funktion über eine hidden form probiert, aber zeigt mir nichts an.
PHP:
function profpeditsize()
	{	
	$code =	md5(uniqid(mt_rand(), true));
return "<form   action=\"..aa.php\" method=\"POST\">";
return"<input type=\"hidden\" name=\"fid\" value=\"$code\">";					
return "</form>";
	}	
	
echo profpeditsize();
aa.php
PHP:
$sid = $_POST['fid'];
echo $sid;
Ich weiß das das Formular erst abgesendet werden müsste damit er die POST Daten bekommt, aber ich hab kein Plan wie ich den Code Sichtbar mache.
 
Du könntest die fid doch gleich an die url hängen. Dann kannst Du die Form mit hash per POST schicken.

PHP:
return '<form action="..aa.php?fid='.$code.'" method="POST">';
return '<input type="hidden" name="sid" value="'.$hash.'">';                    
return '</form>';
(oder ich habs grad falsch verstanden..)

mfg chmee
 
hehe, nochmal;)

Ich rufe eine Funktion auf, diese Funktion ist jetzt in dem Beispiel ganz abgespeckt einfach nur ein
Bild aufruf, also
return " <img src=\"..bild.php?sid=".$code."&id=".$nid."\">";

Die bild.php überprüft mittels GET[sid] ob ein Eintrag existiert. Wenn ja Bild aus Cache, oder aus Datenbank holen.

Mein Problem ist jetzt das ich sid($code) nicht mit img src mitschicken möchte, da bei jeder Anfrage ein neues img src entsteht, obwohls das gleiche Bild ist.
(Eigentlich kein Problem, aber da ich die Bilder Cachen möchte schon. Es gibt kein eindeutiges IMG SRC mehr, da jetzt jeder Aufruf ein anderen sid hat, also theorertisch für den Browser ein anderes Bild ist)
Also alternative Überlegung: Wie schicke ich $code beim Aufruf der Funktion ohne URL übergabe an die bild.php?
 

Neue Beiträge

Zurück