0251 / 590 837 15
info@a-coding-project.de

Simples Caching mit PHP

Ich möchte euch heute mal eine relativ simple Caching-Methode vorstellen, mit den man komplette oder Teile von Seiten zwischenspeichern und somit beschleunigen kann.

Zum Beginn einfach mal ein kleines Script, was lange braucht:

<?PHP
	$i = 0;
	while($i < 60){
		$i++;
		echo time()."<br />";
		sleep(1);
	}
?>

Hier wird jede Sekunde ein Timestamp ausgegeben, ist ja nur zum testen. Da dies (durch das sleep) sehr lange dauert, wollen wir diese Seite cachen, so dass der zweite Aufruf schneller abläuft.

Zunächst verzögern wir aber erstmal die Ausgabe, damit wir den Inhalt abfangen können. Dies geschieht über ob_start. Mit ob_flush, geben wir es am Ende dann aus. Jetzt kommt nicht mehr sekündlich eine Ausgabe, sondern ganz am Ende alles auf einmal:

<?PHP
	ob_start();
	$i = 0;
	while($i < 60){
		$i++;
		echo time()."<br />";
		sleep(1);
	}
	ob_flush();
?>

Neben ob_flush gibt es auch noch die Funktion ob_get_flush. Sie macht im Prinzip genau das gleiche, liefert aber den ausgegebenen Inhalt als String zurück. So ist es möglich den Inhalt nach der Ausgabe in eine Datei zu speichern:

<?PHP
	ob_start();
	$i = 0;
	while($i < 60){
		$i++;
		echo time()."<br />";
		sleep(1);
	}
	$content = ob_get_flush();
	file_put_contents('cache.txt',$content);
?>

Um den Cache zu vollenden, muss jetzt nur noch der Inhalt der Datei ausgegeben werden, wenn diese vorhanden ist:

<?PHP
	if(file_exists('cache.txt')){
		echo file_get_contents('cache.txt');
	}
	else{
		ob_start();
		$i = 0;
		while($i < 60){
			$i++;
			echo time()."<br />";
			sleep(1);
		}
		$content = ob_get_flush();
		file_put_contents('cache.txt',$content);
	}
?>

Um das Script nun universell einsetzbar zu machen, wird der Name der Datei nun durch die Url der Seite generiert:

<?PHP
	$cache_file = "cache_".md5($_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']).".txt";
	if(file_exists($cache_file)){
		echo file_get_contents($cache_file);
	}
	else{
		ob_start();
		$i = 0;
		while($i < 60){
			$i++;
			echo time()."<br />";
			sleep(1);
		}
		$content = ob_get_flush();
		file_put_contents($cache_file,$content);
	}
?>

Und fertig ist es schon 😉 Man kann es natürlich noch stark erweitern und für seine eigene Zwecke anpassen. So ist zum Beispiel das löschen der Cache-Dateien noch gar nicht vorhanden. Aber das ist dann dir überlassen.