Codeschnipsel meiner Seiten

Mit der Zeit finden sich einige Codezeilen an die man findet oder auch selbst sich aufbaut. Der grössere Teil dieser Codeschnipsel habe ich gefunden und lange angewendet. Alle verwende ich mehr oder weniger häufig. Für mich ist diese Seite selbst damit ein Grundstock auf den ich jederzeit zugreifen kann, wenn ich eine neue Seite oder eine Vorlage erstelle.

Meine Seiten baue ich in der Regel mit bestimmten Codeschnipseln immer wieder auf. Deshalb notiere ich an dieser Stelle mal die Praktiken die ich anwende. Sei es nun ob PHP, XHTML oder CSS da werde ich keinen Unterschied auf dieser Seite machen, weil ich auch die Erfahrung gemacht habe das das Zusammenwirken dieser 3 letztendlich nur dazu beitragen kann eine Seite wirklich qualitativ aufzubauen.

CSS

Mit dem folgenden allgemeinem CSS Selektor *{margin:0;padding:0;} sorge ich erst mal dafür das die Abstände für alle Elemente in allen Browser gleich sind.

XHTML

XML Parser

Den Aufruf des XML Parser <?xml version="1.0" encoding="UTF-8"?> starte ich so. Dadurch werden meine Seite schneller dargestellt.

Mit dieser Variante echo '<?xml version="1.0" encoding="UTF-8"?>'; ermögliche ich den Aufruf in einer PHP Datei.

Doc Type

Im Grunde verwende ich einen Doc Type von XHTML der eine Strict Variante ist. Nun habe ich dann diese drei Möglichkeiten. Wobei ich bei der dritten den optionalen Doctype nur angeben werde um im Notfall HTML5 anstatt XHTML5 auszugeben.

XHTML 1.0 Strict

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

XHTML 1.1

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">

XHTML5

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">

Basis Adresse

Generell setze ich bei meinen Seiten das base Element <base href="http://joerghuelsermann.de" /> ein. Auch aus dem Grund das niemand meine Seiten frech kopieren kann. Wenn das jemand dann machen sollte ohne vorher dieses Element zu entfernen führen die Links dann wieder zu meiner Domain.

XHTML Variablen mit PHP setzen

Für einige Meta Elemente verwende ich PHP um die Variablen nicht jedes Mal manuell zu ändern oder auch um eine Browserweiche zur Steuerung des Mime Typs zu haben.

Meta Element Mime Typ

Die Variable für dieses meta Element in Hinsicht des Mime Typ wird mit einem PHP Skript ermittelt anhand des verwendeten Browsers.

echo '<meta http-equiv="content-type" content="'.$header_content_type.'; charset=UTF-8" />';

Meta Element letzte Änderung

Analog des Last Modified Header könnte man die Variable für dieses Meta Element was die Ermittlung des Datum der letzten Änderung betrifft noch erweitern. Mittlerweile habe ich mich dazu entschlossen ganz auf dieses Meta Element zu verzichten.

echo '<meta name="date" content="'.date('c',getlastmod()).'" />';

PHP

Zuerst das wichtigste. Ich wende die Ausgabe der Fehlermeldungen error_reporting(E_ALL); in PHP bewusst an um zu gewährleisten das der Code sauber ist und alle Variablen initialisiert sind.

Gzip Komprimierung

Eine Gzip Komprimierung erreicht man per PHP mit folgendem Aufruf ob_start();. Er dient auch als Startpunkt für die Anwendung des Etag.

Mime Typ

Durch dieses Skript gewährleiste ich das für die Browser, die mit dem Mime Typ application/xhtml+xml umgehen können dieser gewählt wird. Für alle anderen Browser wird als Mime Typ text/html gesendet. Zugleich wird als Zeichensatz UTF-8 angegeben. Dieser Header hat eine höhere Priorität als jedes Meta Element. Wenn man dieses Skript verwenden möchte sollte man sich bewusst machen das es validen Code vorraussetzt für eine einwandfreie Darstellung der Seiten. Dem Betreiber von floern.com verdanke ich den Tipp zu diesem Skript zu einem Zeitpunkt, wo ich noch nicht in der Lage war diese Lösung selbst zu entwickeln.

if (strpos($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml')!==false)
{
$header_content_type = 'application/xhtml+xml';
}
else
{
$header_content_type = 'text/html';
}
header('Content-Type: '.$header_content_type.'; charset=UTF-8');

Prinzipiell kann man diese Weiche auch benutzen um für HTML5 die XML Deklaration zu unterdrücken.

Last Modified

Einen Last Modified Header per PHP zu setzen wende ich in einigen Fällen an. Damit dieser dann aber auch stimmt lasse ich in die Berechnung dazu die Änderung der Seite oder anderer Seiten die ich einbinde oder auch Datumsangaben aus einer Datenbank einfliessen. Wenn alle Daten auf dem Unix Zeitstempel basieren ist das ohne vorherige Umrechnung möglich. Diese Angabe ist für solche Seiten geeignet deren Inhalte sich nicht bei jedem Aufruf ändern und wird unterstützt wenn man auch einen Etag einbindet.

header('Last-Modified: '.gmdate('r',max(getlastmod(),filemtime('../pfad/datei.php'),$datum)));

Wechselnde Inhalte

Will ich das Gegenteil aber erreichen das ich sicherstellen möchte das eine Seite neue Inhalte bei jeden Aufruf präsentiert setze ich folgendes ein. Die Seite wird nun bei jedem Aufruf neu geladen selbst wenn ich per htaccess bei anderen Seiten dieser Domain längere Zeiten vorgegeben habe. Das Datum sollte in der Vergangenheit liegen.

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 14 Aug 2010 05:00:00 GMT');

Etag

Der Etag dient mir dazu dann wenn ich beispielsweise eine Zeitangabe nicht ermitteln kann doch eine sichere Anwendung des Last Modified Header zu gewährleisten. Die Position für diesen Teil ist am Ende des Skriptes und ich darf vorher keine Ausgabe gesendet haben. An den Anfang des Skriptes wird der Code der auch eine Gzip Komprimierung ermöglicht gesetzt. Ich verwende diesen Etag auch für eine CSS Datei die je nachdem welche Seite diese aufruft nur das sendet was momentan benötigt wird. Auf dieser Seite fand ich die Idee für das Skript und habe daraufhin noch einige Modifizierungen vorgenommen.

$lastmodified = gmdate('r',max(getlastmod(),filemtime('pfad/datei.php')));
$output = ob_get_clean();
$etag = dechex(getmyinode()).'-'.dechex(mb_strlen($output,'UTF-8')).'-'.dechex(getlastmod());
header('Content-Type: '.$header_content_type.'; charset=UTF-8');
header('Etag: '.$etag);
header('Last-Modified: '.$lastmodified);
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) and $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header('Status: 304');
}
else
{
echo $output;
}

Momentan weiche ich von der ersten Berechnung des Etag $etag = sha1($output); ab, weil ich näher an die Spezifikation gelange mit der Berechnung die jetzt verwendet wird. Dabei variere ich etwas für bestimmte Dateien indem ich den Inode nicht sende. In Einzelfällen wird nicht das letzte Datum der Änderung sondern die aktuelle Zeit eingesetzt.

Leerzeichen entfernen

An dieser Stelle kann man den Ausgabepuffer um den Etag zu senden, bereits nutzen um Zeilenumbrüche und Tabulatoren aus dem Quellcode zu entfernen. Das verringert dann den Traffic den die Webseite sendet. Auch könnte man beispielsweise Kommentare aus dem Code entfernen über diesen Ausgabepuffer.

Nachdem $output = ob_get_clean(); setzt man ein $output = str_replace(array("\n","\r","\t"),array('','',''),$output); oder diese Alternative str_replace(array(chr(10),chr(13),chr(9)),array('','',''),$output); mit der man zum selben Ergebnis gelangt.

Formulare

Folgender Codeschnipsel ist manchmal in Formularen sehr nützlich. dirname($_SERVER['PHP_SELF'])