Gestern wollte ich einen auf einem Webserver installierten Extplorer aufrufen, doch alles was ich zu sehen bekam war ein weißer Bildschirm. Was zum… Heute hatte ich dann etwas Zeit, mich mit dem Problem zu beschäftigen. Doch wo anfangen, wenn man nur einen weißes Fenster im Browser angezeigt wird? Ganz klar, debuggen. Dazu kann man entweder global die Debuggausgabe aktivieren oder den folgenden kleinen Schnippsel (In einer Datei Namens debug.php) verwenden:
<?php ini_set('error_reporting', '-1'); ini_set('display_errors', '1'); include('./index.php'); // Bitte geben Sie nachdem '/' an welche PHP Datei Sie prüfen möchten. ?>
Dann ruft man die debug.php auf und man bekommt detailliertere Informationen zur Fehlerursache. In meinem Fall:
Warning: require_once(): open_basedir restriction in effect. File(/usr/local/php5.4/lib/php/PEAR.php) is not within the allowed path(s): (/home/sites/site102/:/home/sites/site102/tmp/:/usr/share/pear/:/tmp/) in /home/sites/site102/web/extplorer/libraries/FTP.php on line 33 Warning: require_once(/usr/local/php5.4/lib/php/PEAR.php): failed to open stream: Operation not permitted in /home/sites/site102/web/extplorer/libraries/FTP.php on line 33 Fatal error: require_once(): Failed opening required 'PEAR.php' (include_path='.:/usr/local/php5.4/lib/php') in /home/sites/site102/web/extplorer/libraries/FTP.php on line 33Ein Blick in die FAQ des Hosters und siehe da, PEAR ist dort in einem bestimmten Pfad enthalten und mit einem set_include_path lässt sich das Problem beheben und Extplorer versieht seinen Dienst wieder wie gewünscht:
set_include_path('/usr/lib/pear');
Wenn ich eine Webseite mit einem cms erstelle, tue ich dies meist in einem Unterordner auf dem Webserver. Wenn die Seite dann Online geht kann man entweder das Root-Verzeichnis anpassen oder mit Hilfe einer index.php eine Weiterleitung einrichten. Das geht ganz einfach mit dem folgenden Codeschnipsel:
<?php header("HTTP/1.1 301 Moved Permanently"); header("Location: http://www.ziel.de/ordner"); exit(); ?>
Da der Code auf dem Server abläuft funktioniert diese Weiterleitung auf jedem Client und mit jedem vorstellbaren Browser.
Es kommt immer wieder vor, dass ein Stück Software nicht so funktioniert wie es soll. Dann muss man auf Fehlersuche gehen. Manchmal ist schnell klar, was das Problem auslöst. Ein anderes Mal ist es nicht so einfach. In den Fällen, wo sich die eigentliche Fehlerursache nicht gleich erschließt, ist es wichtig, dass man den Fehler systematisch eingrenzt.
Als völlig unbrauchbarer Ansatz hat es sich erwiesen, ins Blaue hinein Änderungen am Code vorzunehmen. Das führt in den seltensten Fällen zum Erfolg und wenn, ist oft nicht klar warum.
Also sollte man im ersten Schritt versuchen, durch debuggen oder Testausgaben die Stelle an der der Fehler auftritt einzugrenzen. Wenn man so den Codebereich, in dem der Fehler auftritt, ausfindig gemacht hat und man ihn sogar nachvollziehen kann versucht man im zweiten Schritt zu verstehen, was schief läuft um dann durch geeignete Maßnahmen den Fehler zu beseitigen.
Neben der systematischen Fehlersuche gibt es einen weiteren Bereich bei dem man mit System vorgehen sollte. Es hat sich als Vorteilhaft erwiesen, wenn man ein großes Problem, welches zunächst unlösbar erscheint, systematisch in kleine, lösbare Aufgaben aufteilt. Irgendwann hat man dann durch systematisches Lösen der Teilaufgaben die große Aufgabe umgesetzt.
Mit einem systematischen, geplanten Vorgehen, erreicht man also die Ziele schneller.
Wenn man mit dem Microsoft .net Framework 2.0 in C# mit der folgenden Zeile eine Liste der Named Pipes des Systems ermitteln will, kann es zu einer Fehlermeldung kommen:
string[] strPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Ursache dafür ist, dass es eine Named Pipe mit einem Namen gibt, der kein gültiger Dateiname ist. Mit dem folgenden Code (C#) gelingt das Auslesen aller Named Pipes:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] struct WIN32_FIND_DATA { public uint dwFileAttributes; public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string cFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public string cAlternateFileName; } [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FindClose(IntPtr hFindFile); private List<string> getNamedPipes() { List<string> liNamedPipes = new List<string>(); WIN32_FIND_DATA lpFindFileData; var ptr = FindFirstFile(@"\\.\pipe\*", out lpFindFileData); liNamedPipes.Add(lpFindFileData.cFileName); while (FindNextFile(ptr, out lpFindFileData)) { liNamedPipes.Add(lpFindFileData.cFileName.ToLower()); } FindClose(ptr); liNamedPipes.Sort(); return liNamedPipes; }
Übrigens kann man mit dem Tool PipeList der Microsoft Sysinternals per Kommandozeile eine Liste aller Named Pipes ausgeben lassen.
Hier kann die neue Version (0.85) des Adventkalender-Moduls für joomla! 2.5 heruntergeladen werden. Die Neuerungen sind in dem Artikel beschrieben. Soweit ich weiß, wird der Kalender ab dem 1. Advent (30.11.2014) auf der Webseite http://www.heiligethomas.nl/ angezeigt.
Und auch auf der Webseite des romanischen Klosters Spieskappel wird es in diesem Jahr wieder einen Adventskalender geben. Für diese Webseite war 2012 die Idee geboren worden und ohne Backend umgesetzt. Dank der Niederländischen Kirchengemeinde und deren Hilfe beim Testen und beim Umsetzen liegt er jetzt als installierbare Erweiterung vor. Zur Vorbereitung habe ich auf der Seite der Klosterkirche die neue Version installiert und die Einträge entsprechend vorgenommen. Hier als Vorgeschmack für den diesjährigen Kalender der Link zum Kalender von 2012: http://www.kloster-spieskappel.de/cms/index.php?option=com_adventcalendars&view=adventcalendars&calid=1. Dann muss man auch nicht warten, bis man ein Türchen öffnen darf.