Artikel verknüpft mit 'programmierung':
Link 15.02.11, 20:37:38

Ein simpler Cache mit PHP

Der Sinn von Caches
Caches kommen immer dann zur Anwendung, wenn ein hoher Aufwand für das Neu-Generieren von Inhalten vermieden werden soll. Einen Cache kann man also als Zwischenspeicher bzw. Puffer für Daten, die bereits einmal vorlagen verstehen, der beim nächsten Aufruf verwendet wird, um die Daten schneller zur Verfügung zu stellen.

Beispiele finden sich in diversen Anwendungen (v.a. in Browsern wäre ein Fehlen undenkbar), bei Festplatten, Prozessoren und auch bei (nicht statischen) Webseiten. Zur letzteren Art gehört auch mein Blog, der sich die Inhalte bisher bei jedem Seitenaufruf aus meiner MySQL-Datenbank geholt hat. Das ist sehr rechenzeitlastig, da immer beim Aufruf meines Blogs mehrere SQL-Abfragen ausgeführt werden müssen. Außerdem würde sich ein Cache besonders für viel aufgerufene Seiten rentieren.
Also habe ich mich hingesetzt und eine Art Puffer in meiner Blogsoftware implementiert.

Die Funktionsweise
Grob zusammengefasst tut mein Cache folgendes: Beim Aufruf einer Seite mit einem bestimmten GET-Parameter wird eine Funktion aufgerufen, die die URL der aufgerufenen Seite ausliest. Die Funktion holt sich die generierte Ausgabe der Seite, also das Ergebnis der SQL-Abfragen, und speichert diese in einer nach der Seite benannten Textdatei ab. Wenn anschließend ein Seitenaufruf stattfindet, wird von nun an nicht mehr die Datenbank bemüht, sondern der komplette Inhalt der Textdatei ausgegeben. Das ist wesentlich performanter und verkürzt die Ladezeiten.

Die Grundlage, also das Speichern der generierten Inhalte einer Seite, bieten die Funktionen der PHP-Ausgabepufferung:
function cache_schreiben() { $datei = fopen("cache/".preg_replace("/([&\?]cache=)([^&^\"]+)/i","",$_SERVER[REQUEST_URI]).".cache","w+"); $file=ob_get_contents(); fwrite($datei, $file); fclose($datei); }
Das ist die Funktion, die den PHP-Buffer ausliest und den Inhalt in eine Datei schreibt. Mit dem regulären Ausdruck wird der GET-Parameter „cache“ ausgefiltert, der lediglich dazu zuständig ist die Erneuerung des Caches zu bewirken. Möglicherweise muss vorher noch die Ausgabebufferung aktiviert werden, bei mir ist das nicht der Fall.
$datei="cache/".preg_replace("/([&\?]feed=)([^&^\"]+)/i","",preg_replace("/([&\?]cache=)([^&^\"]+)/i","",$_SERVER[REQUEST_URI])).".cache"; if(!isset($_GET['cache']) AND file_exists($datei)) { $datei=fopen($datei, "r"); while (!feof($datei)) { $buffer = fgets($datei, 4096); echo $buffer; } die; }
Diese Abfrage sollte am Anfang der Seite eingebaut werden. Die Textdatei wird, wenn sie existiert und der GET-Parameter nicht gesetzt ist, ausgelesen und der Inhalt ausgegeben. Jetzt muss nur noch festgelegt werden, was passiert wenn die Datei nicht vorhanden ist oder der Parameter an die URL angehängt worden ist:
if (!file_exists($datei) OR $_GET['cache']==1) { cache_schreiben(); }
Fertig!

tags:#php #programmierung #web


Link 08.04.10, 18:56:07

[C++] Bildschirmauflösung und Farbtiefe aus Datei lesen

Die Datei hat diese Struktur:

settings.ini:
Width = "640"; Height = "480"; BPP = "32";
Die Variablen liest man mit diesem Code aus:

// Variablen int width; int height; int bpp; // Konfigurationsdatei auslesen ifstream in("settings.ini"); char c; for( string key, value ; in >> key >> c && c == '=' && in >> c && c == '"' && getline( in, value, '"' ); ) { if( key == "Width" ) { // in int umwandeln und in variable speichern width = atoi(&value[0]); } else if(key == "Height") { // in int umwandeln und in variable speichern height = atoi(&value[0]); } else if(key == "BPP") { // in int umwandeln und in variable speichern bpp = atoi(&value[0]); } if( in >> c && c != ';' ) in.setstate( ios_base::failbit ); }

Das Fenster erzeugt man mit SDL wie gewohnt und setzt statt festen Werten die durch den Benutzer veränderbaren Variablen ein:
// Fenster erzeugen SDL_Surface *screen = SDL_SetVideoMode(width, height, bpp, SDL_DOUBLEBUF);

tags:#c++ #sdl #programmierung


Link 15.02.10, 23:08:32

[PHP]Traffic sparen - Ausgabe komprimieren

Jeder Aufruf einer Seite im Internet verursacht Traffic, Datenverkehr. Je kleiner die Dateien sind die übertragen werden, desto kleiner der Traffic und damit auch die Serverlast, da der Server weniger Daten verarbeiten muss. So ziemlich jeder Computernutzer sollte wissen, dass man durch Komprimierung die Größe einer Datei verkleinern kann, aber dass das auch mit Webseiten funktioniert war zumindest mir neu.
Wie es funktioniert:
Folgender PHP-Code wird ganz am Anfang der zu komprimierenden Datei eingefügt:
<?php if(extension_loaded("zlib") AND strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) @ob_start("ob_gzhandler"); ?>
Falls der Browser gzip-Dekomprimierung unterstützt wird die Webseite komprimiert übertragen, andernfalls wird die Ausgabe ganz normal übertragen und dargestellt. Für den Nutzer ändert sich überhaupt nichts, ausser dass die Seite schneller lädt. Hier kann man überprüfen ob der Browser Dekomprimierung beherrscht.

tags:#internet #blog #programmierung