joerghuelsermann.de Codeschnipsel meiner Seiten

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 drei Techniken letztendlich nur dazu beitragen kann eine Webseite wirklich qualitativ aufzubauen.

Auch wenn ich diese Codezeilen nicht unbedingt in dieser zugegebenen naiven Darstellung verwende sollte diese Übersicht hilfreich genug sein um weitere Ideen zu vermitteln.

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.

Mittlerweile bin ich aber wegen höherer Semantik und auch wegen anderer Vorteile davon überzeugt das mir XHTML5 die meisten Vorzüge bietet.

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" 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" />';

Da ich der Regel keinen Doctype mehr verwende ausser in Ausnahmefällen der diesen teilweise auch unsinnige Anweisung benötigt. Und durch den Server diese Anweisung auch überschrieben wird ist es in meiner Ansicht nach nur nötig in gewissen Fällen um eine Seite zu validieren.

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. Auch ein Punkt den man durch den Server ersetzen kann.

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('ob_gzhandler');. Der Ausgabepuffer dient auch als Startpunkt für die Anwendung des Etag. Wenn ich diesen Ausgabepuffer abfange hat die Komprimierung keine Wirkung mehr. Es ist aber auch möglich einen anderen Weg mit PHP zu realisieren. Auch ist in vielen Fällen eine Komprimierung durch die htaccess erreichbar.

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 (isset($_SERVER['HTTP_ACCEPT']) and 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'])

Direkten Aufruf von Dateien vermeiden

Auch wenn andere Techniken professioneller sind Dateien durch PHP einzubeziehen kann man durch folgendes diese Dateien bei einem direkten Aufruf umleiten. Als Alternative kann man auch Fehlerseiten in diesen Fällen aufrufen. if (count(get_included_files()) == 1){header('Location:http://3jh.de/',true,301);exit;} Das ist für mich ein Punkt, wenn man schon diese Technik einsetzt zumindest für mehr Sicherheit zu sorgen.