preDispatcher - speed up my slow Concrete5 website

Dienstag, 20. August, 2019

Meine Concrete5 Webseite wurde langsamer und langsamer. Sie wird auf einem Shared Hosting betrieben (was ohnehin nicht die schnellste Option sein kann) - hier kann ich zudem keinen Varnish oder anderen Caching Dienst installieren und davorschalten, sondern muss mich mit .htaccess und Standard-PHP-Mitteln behelfen können.

Das Initialisieren eines Requests in Concrete5 (Bootstrapping) braucht scheinbar sehr lange. Selbst statische Inhalts-Seiten, die ein aktives Fullpage Cache haben, benötigen für die Verarbeitung am Server mehr als 200 ms. Hinzu kommen für einen kompletten Request dann noch Netzwerkzeiten für Namensauflösung (DNS), Anfrage zum Server senden … und das Ergebnis zum Browser zurücksenden, was der Browser dann rendert. Meine schnellsten Seiten aus dem CMS waren bei 300 ms. Andere brauchten 3 Sekunden und mehr. Concrete5 ist einfach langsam.

Ich habe einen Cache geschrieben, der Concrete5 vorgeschaltet ist und im Filesystem seine Caching-Daten ablegt. Kurz er hat minimalste Anforderungen und arbeitet mit einem Shared Hoster. Dieses “Vorschalten” umgeht die lange Initialisierungszeit von Concrete5 - dies macht die Seite schnell.

Vor einigen Tagen habe ich eine erste Version meines preDispatchers eingespielt. Erwartungsgemäss muss man ein paar Kinderkrankheiten ausmerzen. Aber erste Ergebnisse in der Webseiten-Statistik (Matomo) zeigen, dass es eine gute Entscheidung war: die mittleren Seiten-Generierungs-Zeiten sanken von über 2s auf unter 0.4s

2019-08-20-predispatcher-generation-time-in-matomo.png

Der PreDispatcher besitzt eine Debugging-Ausgabe, die die Arbeitsweise veranschaulicht und den Unterschied deutlich macht. Das ist ein ungecachter Aufruf einer Seite mit Fullpage Cache in C5 - also inkl. Bootstrapping + Auslieferung einer in C5 gecachten Seite:

2019-08-20-predispatcher-uncached-concrete5-request-of-fullpage-cached-page.png

Der PreDispatcher speichert den Request, der nicht im Cache ist (oder dessen Caching Zeit abgelaufen ist). Der nächste Request auf dieselbe Seite wird dann schnell. Richtig schnell:

2019-08-20-predispatcher-cached-request.png

Wie lange eine Seite aus einem Cache kommt? Man definiert einen Default für alle Seiten. Mit einer Liste von Regex für aufzurufende URLS kann man die Standard-Vorgabe übersteuern und einen neuen Wert zuweisen.

Zudem gibt es eine Erkennung, was nicht gecacht werden darf - oder wo ein Cache verworfen werden muss. Ich kann mich im C5 Backend einloggen - und der Cache jeder mit Login aufgerufenen Seite wird verworfen.

Ich bin wohl auf dem richtigen Weg. Aber ein wenig Feintuning braucht es noch. Bei Interesse, schaut auf Github … oder fragt mich an :-)

Der PreDispatcher ist Freie Software - unter GNU GPL 3!

weiterführende Links:

  1. Github: pre-dispatcher
  2. Concrete5 webseite

post.ch: “keine Sendung” im Kundencenter - und Paket verpasst

Montag, 19. August, 2019

Ich habe mir 6 Pakete an meine Adresse in Bern gesendet. 4 sind bereits da … auf 2 warte ich noch.

Bei der Schweizer Post kann man sich auf dem Webportal registrieren. Und dann hat man ein “Kundencenter”, wo man eintreffende Sendungen verfolgen, die Lieferung auf eine andere Adresse ausliefern lassen kann u.v.m. In Erwartung dass noch 2 Pakete ausstehen, habe ich mich registriert.

Sonntagabend … habe ich geschaut, ob denn zum Montag ein Paket zugestellt werden würde … ich habe es als NEIN interpretiert:

2018-08-19-post_ch_keine_sendungen.png

Montag … nach der Arbeit: ich habe im Briefkasten eine Info, dass mir ein Paket nicht zugestellt werden. Hm, toll. Dann habe ich wohl zu viel von dem Service erwartet.

Was aber tadellos funktioniert: Ich kann nun auf post.ch vom Zettel der Post (a.k.a. “Abholungseinladung”) den Abholcode bei https://www.post.ch/abholungseinladung eingeben, dann auf den Pin zum Hinzufügen klicken, und voila - dann sehe ich beim Wechsel in das Kundencenter mein Paket, dass auf eine Abholung wartet:

2018-08-19-post_ch_abholung.png

OK, das wusste ich ja, das steht ja auch auf dem Zettel drauf.

Wie soll ich eine Sendungsnummer vorab kennen, damit ich sie eingeben kann?

Die Sendungsnummern aller meiner Pakete habe ich noch von der Aufgabe auf der Postfiliale in D vor mir liegen. Diese werden jedoch nicht als Eingabe auf post.ch akzeptiert. Scheinbar wird es in er Schweiz umgelabelt: bei der Sendung, die nun zur Abholung bereit ist, sieht die Sendungsnummer der Schweizer Post komplett anders aus. Ich kann absolut keine der Angaben auf dem Abholschein der Schweizer Post mit irgendeiner Angabe auf den Quittungen der Deutschen Post matchen. Man hat als Kunde verloren.

Irgendwie hat sich mir der Sinn dieser Funktion “meine Sendungen” noch nicht ganz erschlossen. Ich will doch *vorher* wissen, ob ein Paket eintrifft, oder etwa nicht??? Es klingt nach einer guten Idee - ist aber praktisch nicht verwendbar. Gut gemeint ist das Gegenteil von gut gemacht.

PHP-Snippet - URL Parameter escapen

Sonntag, 23. Juni, 2019

Dieser Blogeintrag ist eine Snippet-Ablage.

Die PHP-Funktion mysql_real_escape() maskierte Sonderzeichen in Werten, bevor man sie für Datenbankabfragen verwenden sollte. Die Funktion arbeitet nur dann, wenn Mysql vorab initialisiert wurde.

/**
* mysql_real_escape for an array of options
* @param array $aParams
* @return array
 */
function escapeAllParams($aParams) {
    foreach (array_keys($aParams) as $sKey) {
        $aParams[$sKey] = escapeParam($aParams[$sKey]);
    }
    return $aParams;
}

/**
* replacement for mysql_real_escape.
* @param string $s
* @return string
*/
function escapeParam($s) {
    $s = str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $s);
    return $s;
}

A Touch Of Glass - Theme für Flatpress

Samstag, 15. Juni, 2019

Mein bisheriger Blog war über Jahre immer ein Custom style … aber eben nicht public.
Nun habe ich meinen erstes Theme für Flatpress veröffentlicht. Vom Look her ist es der klassische Blog Style mit einem hellen Theme als Basis. Wegen der Transparenzen taufte ich es “A Touch Of Glass”.

Warum überhaupt … es gibt ja bereits mehrere Themes?!

  1. Mich stört in Flatpress, dass man den Filter auf einen Monat oder eine Kategorie nicht visualisiert hat. Ich hatte es bis anhin mit einem Hack gelöst. In diesem Theme ist es mit Javascript implementiert: In der Widget-Box ist es nun hervorgehoben als auch im Headerbereich sichtbar.
    2019-06-15-fp-atog-show-category.png
  2. Mehrere Themes für ein 2 oder 3-Spalten-Layout? Das ist unnötig. Wer mag, darf es gern adaptieren. Im Flatpress-Backend platziert man Widgets in einzelne Bereiche. Von mind. 1 Widget benutzte Spalten werden angezeigt; ungenutzte nicht. Klingt banal. Und ist es per CSS an sich auch.
  3. Es fehlen Icons. Naja, an allen Ecken und Enden. Ich habe im Theme per CDN Fontawesome eingebunden und an so einigen Stellen per CSS im Frontend als auch Backend integriert.
  4. Ich wollte ein cooleres Backend. Es soll schliesslich auch 2019 Spass machen, einen neuen Blog-Eintrag zu machen.
    2019-06-15-fp-atog-admin.png

Das Theme gibt etliche Rahmenbedingungen vor. Die Syles - 4 liefere ich einmal mit - sind nur noch extrem einfache CSS Dateien, die einige Default-Farben übersteuern.

2019-06-15-fp-atog-style-blue.png 2019-06-15-fp-atog-style-red.png 2019-06-15-fp-atog-style-sunny.png 2019-06-15-fp-atog-style-teal.png

Weitere Farb-Schemata zu erstellen wird zum Kinderspiel. Wer mag, kann sich eine style.css eines Farbschemas ansehen: es werden CSS Variablen definiert und diese in denjenigen CSS Selektoren angewendet, die übersteuert werden sollen.

Hey, wenn ihr es für gut befindet, empfehlt/ teilt es weiter :-)

UPDATE

  • 19.06.2019: Es sind ein Freitextfilter mit Highligntning bei Kategorieen und auf- und zuklappbare Jahre im Archiv hinzugekommen. Ich hab es nun mal v1.0 genannt :-)
  • 06.08.2019: Mein Twitter-Posting wurde auf dem Flatpress Channel eingefügt (s. Link [6])

weiterführende Links:

  1. Github: Projekt Seite des Themes
  2. Github: Theme A Touch Of Glass als ZIP
  3. Flatpress.org Blogging Engine in PHP ohne Datenbank
  4. Fontawesome Iconset
  5. Twitter: Axels Tweet
  6. Twitter: Flatpress Tweet … und Channel

Amazon Alexa - meine Seite kommt Rang 60.000 näher

Donnerstag, 30. Mai, 2019

Amazon Alexa … ist das nicht ein Lautsprecher?
Wenn wer sich das fragt, hat Amazon vielleicht ein Branding Problem. Aber das soll nicht meines sein.

Nein, ich meine das schon viel ältere Amazon Alexa - das mit mit den Webseiten-Rankings.

Hin und wieder schaue ich, wie sich das Ranking von axel-hahn.de in Deutschland verhält. Und das schwankt! Was ich über die letzten Monate so sehe:

  • Im März lief es mal aus dem Listing heraus (über Platz 150.000 vermute ich).
  • Binnen einer Woche schwankt es mal um 30.000 Plätze. Auf 4 Stellen nach - äh: VOR - dem Komma braucht man nicht so genau schauen.
  • Seit Ende März 2019 bewegt es sich um Platz 100.000 (+/- 10.000 Plätze)
  • Ende April war er bei Rang 135.000 (weltweit: 1.5 Mio) … und fällt seitdem
  • Am 29.5. kam ich auf 60931 (weltweit: 1.2 Mio)

Wenn ich mal Zeit habe (hm, das ist ein ganz böses geflügeltes Wort für: das tritt eh nie ein :-)), dann mache ich die PHP-Klasse, mit der ich die Alexa-Statistik einhole, mal schön … wie auch öffentlich.

weiterführende Links:

  1. Golb Slexa: Klettern im Alexa-Ranking
  2. www.alexa.com (en)