WordPress-Fehler anzeigen

Aktuell deaktivieren viele Hoster die veraltete PHP Version 7 und stellen auf PHP Version 8 um. Das führt dazu, dass gewisse Codezeilen Fehlermeldungen und Warnungen provozieren können (Deprecation-Notices). Wer wie ich nicht alle WordPress-Plugins auf der neuesten Version am Laufen hat, bekommt diese plötzlich angezeigt oder aber einzelne Seiten, z.B. Produkteseiten in Woocommerce, werden nur noch fehlerhaft dargestellt..

Diese Notices führen nicht zwangsläufig dazu, dass die Seite nicht mehr funktioniert und werden deshalb vom WordPress-internen Fehlermanagement nicht abgefangen. Die Standardeinstellungen von WordPress aber verstecken die Fehlermeldungen. Das Resultat ist unschön: Eine halb funktionierende Seite.

Hilfe zur Lösungsfindung

  1. Direkt auf dem Hosting die Datei wp-config.php im obersten Verzeichnis von WordPress zum Editieren öffnen. Bei Unsicherheiten zuerst eine Sicherheitskopie der Datei anfertigen.
  2. Die Zeile define( 'WP_DEBUG', false); suchen (Oder im oberen Teil einfügen) un den Wert von false auf true ändern.
  3. Betroffene Seite aufrufen. Die Fehlermeldungen sollten jetzt sichtbar sein und das verursachende Plugin identifizierbar machen.
  4. Fehler beheben.
  5. Den Wert define( 'WP_DEBUG', false); wieder auf false zurück wechseln.

Temporär kann die PHP Version je nach Hoster noch für eine Übergangsfrist auf die veraltete Version 7 hinuntergesetzt werden. Längerfristig ist ein Update der WordPress-Instanz & -Plugins unabdingbar.

PHP-Package MyTS – Zeitreihen in SQL-Datenbanken

Wer als Werkzeug nur eine SQL-Datenbank hat, sieht in jedem Problem relationale Daten.

Aus der alten Architektur von meiner OpenData-Seite api.existenz.ch ist eine isolierte PHP-Bibliothek zum Speichern und Abfragen von Zeitreihen entstanden: MyTS (My Time Series).

Da auf dem verwendeten Shared Hosting nur eine MySQL-Datenbank zur Verfügung steht, lagern die aktuellen Daten dort relational und besser verfügbar als mein Langzeit-Datenarchiv auf InfluxDB.

Das spannende Details hier: Für das Unittesting mit einer echten Datenbank wird in den GitHub Actions ein eigener Datenbankcontainer hochgefahren.

Webprojekt: Freiraum – Nächste Kalendertermine anzeigen

Screenshot von Freiraum: Zeigt die nächsten Termine eines Kalenders an

Um die spontane Nutzung der Gemeinschaftsräume unserer Siedlung zu erleichtern, haben wir in der IT-Gruppe ein minimalistisches Tool entwickelt: Freiraum.

Es zeigt den aktuellen Status (Besetzt/Demnächst besetzt/Frei) eines Raumes an, indem es den öffentlichen iCal-Feed des privaten Reservationssystemes ausliest und die nächsten Termine anzeigt.

Den Quellcode gibt es auf GitHub: github.com/oberfeld/freiraum

Aus Datensparsamkeit ist absichtlich kein Link zum effektiven Reservationssystem oder zu einzelnen Räumen vorhanden.

MIT-lizenziert. Simples PHP 8. Keine Authentifizierung, keine Datenbank, keine Benutzerverwaltung, kein Errorhandling. Erster Versuch mit Tailwind CSS.

PHP-Package: temporal-shelf

Das dritte Packet aus dem aktuellen Refactoring von api.existenz.ch ist temporal-shelf.

Die kleine Utility-Klasse erlaubt es Dateien in ein Archiv zu kopieren, in einer Jahr/Monat/Tag-Struktur abgelegt und versehen mit einem Zeitstempel.

Beispiel: daten.txt wird kopiert nach /archiv/2020/11/09/1604953664_daten.txt.

Spannendes Detail: Mit dem Package vfsStream kann ein virtuelles Dateisystem im Speicher erstellt werden, in welchem bequem und ohne Seiteneffekt die Unittests ablaufen.

PHP-Package: parse-swissmetnet

Im Rahmen eines Code-Refactoring (auch Refaktorisierung, Refaktorierung oder Restrukturierung) habe ich nach Jahrzehnten von PHP-Coden mein erstes Composer-Package geschrieben und publiziert: cstuder/parse-swissmetnet.

Es dekodiert Daten und Metadaten aus dem automatischen Wettermessenetz der MeteoSchweiz, welche auf dem Opendata.swiss-Portal publiziert sind.

Besonders Freude habe ich an den neuen GitHub-Actions welche die beiliegenden Unittests bei jedem Push automatisch durchführen.

PHP-Buildsystem mit Fehlererkennung für Sublime Text 2 und 3

Im Texteditor Sublime Text können PHP-Dateien folgendermassen direkt ausgeführt werden: Über das Menu Tools – Build System – New Build System… den folgenden Inhalt in eine Datei names PHP.sublime-build speichern.

Unter Linux/Mac OS X:

{
    "cmd": ["php", "$file"],
    "file_regex": ".* in (.*\\.php) on line ([0-9]*)",
    "selector": "source.php",
}

Unter Windows (Den Pfad zum PHP-Interpreter anpasssen):

{
    "cmd": ["c:\\wamp\\bin\\php\\php5.4.12\\PHP.exe", "$file"],
    "file_regex": ".* in (.*\\.php) on line ([0-9]*)",
    "selector": "source.php",
}

Danach führt Sublime Text mit CTRL-B eine PHP-Datei aus und springt mit F4 gegebenenfalls von Fehler zu Fehler.

Debugging

Zum Debuggen gibt es das SublimeTextXDebug-Package. Allerdings habe ich es noch nicht geschafft, dieses erfolgreich zu konfigurieren. Bis es soweit ist, bleibt Eclipse PDT die Entwicklungsumgebung meiner Wahl.

Campus Bern: Symfony 2

CampusAm kommenden Dienstag (23. Oktober 2012, 1900) findet der Campus zum Thema Symfony 2 bei Liip am Kornhausplatz 14 statt.

Wir nehmen das PHP-Framework Symfony2 und Symfony2 Content Management (CMF) unter die Lupe – etwas Theorie und viel Praxis. Vortrag von Tobias Kluge und David Buchmann

Die Veranstaltung ist für alle Interessierte offen und gratis. Anfahrtsinformationen und weiteres wie immer im Campus Wiki.

Freiwillige Anmeldung auf techup.ch.

.NET-Bibliotheken aus PHP aufrufen

Bei meiner Arbeit standen wir kürzlich vor der Aufgabe, eine Windows-.NET-DLL-Funktion aus PHP anzusprechen. Interessanterweise ist die COM-Unterstützung bei allen geläufigen PHP-Versionen für Windows seit Version 4 bereits eingebaut. Auch eine .NET-Unterstützung ist vorgesehen, jedoch schlecht dokumentiert. Dieser Beitrag soll den aktuellen Stand unserer Bemühungen dokumentieren.

Voraussetzung
Nur der Zend Server Community Edition bringt im Moment ein PHP 5.3.5 mit aktivierter .NET-Unterstüzung mit: Die Extension com_dotnet ist enabled.
Weder XAMPP noch WAMP haben diese von sich aus einkompiliert.

Anforderungen an die DLL
Um eine .NET-DLL mit dieser Extension ansprechen zu können, muss sie folgende Anforderungen erfüllen:

  • Die .NET-Frameworkversion darf maximal 3.5 sein. .NET 4.0 funktioniert aktuell nicht.
  • Die DLL muss streng benannt und signiert sein (strongly named & signed)
  • Die Funktionen der DLL müssen COM accessible sein (Kann in den Assembly informations aktiviert werden.)
  • Die DLL muss sich im Global Assembly Cache/GAC befinden. Mit dem Kommandozeilenbefehl gacutil /i NAME.dll wird sie dort hin befördert.

Der letzte Punkt ist wahrscheinlich auch der Grund, warum PHP keine 4.0-DLLs schluckt: Im Gegensatz zum alten GAC unter c:/Windows/assembly befindet sich der neue GAC unter c:/Windows/Microsoft.NET/assembly. Je nach Frameworkversion landet die DLL automatisch im richtigen GAC, wird aber von PHP nur im ersteren gesucht.

Verwendung
Um eine .NET-Klasse aus einer DLL zu instanzieren, benötigt man den vollen Namen der Assembly und den kompletten Klassennamen. Ein Tool wie ILSpy hilft dabei, diesen herauszufinden und wie folgt zu verwenden:

$obj = new DOTNET('Voller.Assembly.Name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463', 'Voller.Assembly.Name.Klassenname');
 
echo $obj->MeineMethode();

Da mit dieser Extension immer eine Klasse instanziert wird, sind dementsprechend nur Klassenmethoden aufrufbar. Statische Klassen und Methoden funktionieren nicht und erzeugen nur kryptische Fehlermeldungen.

Ich hoffe, mit diesem Artikel anderen Benutzern dieser exotischen Kombination von Systemen etwas weitergeholfen zu haben. Kommentare und Anmerkungen sind herzlich willkommen.

Xdebug unter OS X Lion installieren

Ich brachte unter dem neuen Mac OS X Lion das Programm phpize nicht zum laufen und konnte deshalb meine Lieblings-PHP-Extension Xdebug nach dem Update auf Lion nicht frisch installieren. Glücklicherweise fand ich im Verzeichnis /usr/lib/php/extensions/no-debug-non-zts-20090626 noch die Datei xdebug.so von Snow Leopard.

Um diese Extension zu aktivieren, erstellt man mit Rootrechten im Verzeichnis /etc eine neue Datei php.ini und schreibt folgendes hinein:


zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
xdebug.remote_enable = On

; Und wenn wir schon mal hier sind...
error_reporting = E_ALL | E_STRICT
date.timezone = Europe/Zurich

Nicht vergessen, den Webserver danach neu zu starten.