Drupal Profile – Gallery

Ich habe noch ein wenig weiter rumgespielt. So Drupal Profiles sind schon noch recht cool. Würde mich über Feedback freuen.

Download ist hier.

Das Profil lässt sich dann ganz normal installieren:

Inhaltstypen, views usw. Ich bin jetzt noch ein wenig am Dinge sammeln, welche so ein Profil ausmachen würden, damit man ein Picture Drupal hat, welches einfach nur eine Fotogalerie ist.

Drupal Performance II – Bremsklötze

Drupal ist nicht gerade sparsam, wenn es an die Anzahl von Queries geht. Hier eine kleine Auflistung, wo es “Query-Schleudern” gibt.

  • Mobile Tools: Eigentlich ein praktisches Tool, aber es hat noch ein paar Problemchen. Wenn man viele Rollen hat, dann werden eine Unmenge an Queries generiert. Ich habe da je nach Seite zwischen 80 und 200 Queries gezählt.
  • Node Relationen: Das ist etwas super praktisches. Man kann alle möglichen Sachen damit abbilden, doch wie sieht es mit der Performance aus. Als ganz simples Beispiel: Einen Artikelnode und ein Bildnode. Beides wird über eine Noderelation verbunden. Um den Artikel darzustellen, muss zuerst node_load für den Artikel aufgerufen werden und dann entsprechend noch node_load für das Bild. Wenn jetzt auf einer Seite 10 Artikel sind, dann summiert sich das ziemlich schnell auf.
Es ist zwar extrem praktisch node_load zu verwenden, aber man sollte dabei die Performance im Hinterkopf halten.
  • Übersetzungen: Übersetzungen über die T Funktion t(), werden hauptsächlich im Backend verwendet. Jede t() Funktion bedeutet eine DB Anfrage. Auch das kann sich aufsummieren.
  • Links: Links welche über die l() Funktion gebaut werden, verlangen ebenfalls eine DB Abfrage, da geschaut wird, ob es einen Alias gibt. Dabei handelt es sich um eine ganz einfache Select Abfrage, aber es ist nicht die Komplexität, sondern die Masse. In einem Link Block finden sich schnell mal 30 Links, was bedeutet, dass 30 Abfragen gemacht werden müssen.
  • XML Sitemap: Entpuppte sich als wahrer Bremsklotz. Noch ist mir nicht ganz klar, was hier genau die Ursache ist, da ich noch nicht dazu gekommen bin, das Modul genauer zu untersuchen. Die XML Sitemap generiert ein XML, welches eigentlich alle Links der Seite enthält und schickt dieses XML an Suchmaschinen, damit der Inhalt optimal indexiert wird.
Aus irgend einem Grund führte die Generierung dieses XMLs zu extremer CPU und Datenbanklast (Spitzen von 3000 Queries pro Sekunde), bis der Server ein Timeout gab.

Viele dieser Abfragen lassen sich durch Einsetzen eines Caches abfangen. Cache ist King! Nehmen wir zum Beispiel einen nochmals unseren Links Block mit den wichtigstens Links im Footer (wie z.B. auf der Skype Seite). Dieser Block ist auf jeder Seite identisch. Ohne Blockcache wird jedoch für jeden Link eine Datenbankabfrage nötig sein, was völlig unnötig ist. Blockcache einschalten und sicherstellen, dass der Cache für diesen Block auf “global” gestellt ist, will heissen, dass der erste User, der eine Seite aufruft, den Block generieren muss und jeder folgende dann einfach die fertige Version aus dem Cache bekommt, bis zum nächsten Mal, wenn der Cache wieder frisch aufgebaut wird (defaultmässig ist das beim Speichern eines Nodes).

Drupal Performance I

Hier werden in den nächsten Tagen Wochen Beiträge zu Drupal Performance und Optimierung kommen… fangen wir doch mal mit den Basics an.

Die Modularität hat ihren Preis. Wenn man ein paar Module im Einsatz hat, dann wird eine Drupal Installation schnell einmal langsam. Es werden unmengen von SQL Queries abgesetzt, um die notwendigen Seite zusammenzustellen (einige hundert bis einige tausend). Das schlägt sich natürlich in der Geschwindigkeit nieder. Gut ist es sicher, dies zu vermeiden, was aber nicht wirklich immer möglich ist, bzw. mit Funktionseinbussen verbunden ist, denn über hook_nodeapi hat jedes Modul die Möglichkeit, beim Nodeload den Node zu modifizieren. Dadurch kann doch eine beachtliche Anzahl an Abfragen entstehen. Einige Module setzen dafür einen Cache ein, andere wiederum nicht. Das heisst: Ein node_load ist nicht ein grosser Query mit einigen Joins, sondern besteht aus vielen kleinen Queries. Das heisst, wenn jetzt auf einer Seite einige Nodes geladen werden müssen (Teaser, Übersichtsseiten, Nodeblöcke usw), dann kann sich das schnell kumulieren.

Lässt sich das ändern? Es lässt sich sicher vermeiden, indem die Module sorgfältig ausgewählt werden, aber die Grundproblematik bleibt bestehen. Die Flexibilität, welche dadurch entsteht ist dafür fantastisch.

Auswege. Liegen eigentlich beim Caching. Hier gibt es diverse Strategien, aber erst einmal gilt es, die Drupal Board Mittel zu benützen, welche für kleine Seiten durchaus ausreichend sind:

  • CSS Aggregation ist ein Muss
  • JS Aggregation eigentlich auch, aber führt jeweils bei deutschsprachigen Seiten zu Problemen. Also ich habe da immer Probleme mit einem File, welches nicht gefunden werden kann. Dafür gibt es ein nettes kleines Modul und schon klappts wieder.
  • Drupal Cache. Der ist eigentlich super genial, aber funktioniert nur für den anonymen Besucher. In manchen Fällen mag das ausreichend sein, aber manchmal auch nicht.
  • Blockcache ist mein Held.Wie weiter, wenn die Seite wächst und wächst. Es gibt diverse Module, mit welchen ich in den letzten Tagen/Wochen Erfahrungen gesammelt habe. Diese beschränken sich momentan auf die folgenden drei Module:
  • Boost
  • Cacherouter
  • APC

Boost
Super einfach zum einsetzen. Es lässt sich auch sehr gut auf einem shared hoster einsetzen. Mein Blog hier wird von Boost unterstützt. Dabei wird die Datenbank für den anonymen Besucher entlastet, indem von der Seite eine statische Seite angelegt wird. Ein Besucher tangiert somit Drupal gar nicht, sondern wird direkt auf die statische Seite geleitet. Dies kann natürlich zu verfälschung von Statistiken führen.

Cacherouter
Ist eigentlich lediglich ein Abstraktionslayer nicht ein eigentlich Cache. Der Cacherouter kann sehr gut zusammen mit Authcache eingesetzt werden. Mit dem Cacherouter kann man jetzt bestimmen, wo sich der Cache befinden soll. Z.B. Memcache, APC, File, Datenbank usw.

Im Weiteren habe ich mir auch noch Authcache angeschaut, kam jedoch bisher noch nicht zum produktiven Einsatz. Authcache macht eigentlich etwas ähnliches wie Boost, jedoch für den Eingeloggten User. Die Seite wird als HTML gespeichert und in die DB abgelegt. Beim darauffolgenden Seitenaufruf kann der HTML fixfertig gerendert aus der DB genommen werden, zusätzlich wird die Möglichkeit geboten, Userzentrierte Blöcke mit Ajax entsprechend anzupassen.
Boost und Authcache lassen sich gut auch zusammen nützen, da man Authcache mitteilen kann, welche Rollen den Cache verwenden sollen.

Das sind relativ einfache Massnahmen. Boost läuft eigentlich auf jedem Hoster. Komisch -> bei uns haben wir noch Probleme mit dem Cache löschen?! Keine Ahnung, was da schief geht.

Apache Logs auswerten

Immer noch am Performance Optimieren. Dabei habe ich mir die letzten Tage die Apache Logs vorgenommen, um Unregelmässigkeiten zu finden. Nach einem ersten Versuche diese im Texteditor auszuwerten war ich recht frustriert. Da bringt man nicht wirklich viel raus.

Die Lösung ist: awstats. Installation ist nicht ganz so einfach, aber mit einer guten Anleitung schnell durchführbar.

Awstats

Drupal Fotogalerie installer profile

Obwohl ich in der letzten Zeit ultimativ beschäftigt war, Performance Probleme zu lösen, habe ich zwischendurch ein paar freie Minuten gefunden, um ein bisschen “zu spielen”. Ich wollte schon lange mal mit den Drupal Installer Möglichkeiten experimentieren. So habe ich das hübsche Theme von Managing News genommen und damit eine Fotogalerie gebaut (bzw. einen Installer dazu). Wa wird beim Installieren gemacht:

  • Alle nötigen Module installiert
  • Ein Feature installiert, welches die Views enthält, sowie Inhaltstypen und Imagecache Presets, sowie ein paar Berechtigungen.
  • Umstellung auf das korrekte Theme

Leider unterstützt Features Modul zur Zeit noch Menus. Hier bin ich dran ein bestehendes Stück Code weiterzuentwickeln, damit sich in Zukunft auch Menus mit Features portieren lassen. Alles in Allem sind Installer zusammen mit Features erst richtig cool!

Den Picmaster habe ich mal hier zum Download.

Die Schönheit der Kommandozeil

Dass ich so etwas mal schreiben würde, hätte ich mir nicht träumen lassen. Mittlerweile habe ich weitere 2 Wochen produktiv mit einem Linux System (Ubuntu) gearbeitet. Ist es mir verleidet? Nein. Je länger desto mehr, hat sich herausgestellt, dass ein Verständnis des darunter liegenden System umso wichtiger ist und die Arbeit umso effizienter gestaltet (wir reden hier von der professionellen PHP Entwicklung für grössere Projekte):

  • Apache unter Windows ist weiterhin extrem langsam und stürzte bei mir regelmässig ab, was zeitweilen frustrierend und zeitraubend zugleich ist
  • Server Probleme? Ja, es gibt Putty, doch wenn man nicht vertraut mit der Kommandozeile ist, dann wird man nicht wirklich Freude haben. Wie macht man sich vertraut damit? … sicher nicht unter Windows
Serverprobleme: Endlosschlaufen auf dem Server? Sonstige komische Serveraktivitäten? Kein Problem: Kommandozeile an, via SSH einloggen “top” und schon sieht man, was abgeht und kann via “kill” ungewollte fehlerhafte Prozesse killen.
  • Drush. Ode on Drush. Schnell ein paar neue Module installieren, aktualisieren bzw. deaktvieren? “drush en admin_menu”. Wunderbar. Eine ganze Installation aktualisieren? Auch das ist möglich. Aber eben nur via Kommandozeile -> supereffizient.
  • Remotezugriff? Problemlos: Offener Port 22 und IP Adresse von Zielrechner und schon klappt es wunderbar und auch unter etwas langsameren Umständen.

… PHP Entwicklung: Nur noch unter Linux.

Ich lebe noch

Ich habe schon Anfragen bekommen, ob ich noch am Leben bin ;) … es ist auch echt schon ein weilchen her, seit ich das letzte Mal von mir hören habe lassen. Im Moment bin ich gerade noch extrem beschäftigt mit dem relaunch von www.schweizer-illustrierte.ch. Im Moment steht noch die Performance Optimierung an. An dieser Stelle gibt es hier demnächst auf jeden Fall ein paar Erfahrungsberichte zu APC, Boost und co. Zuerst muss jedoch die Seite einwandrei laufen.

Bis dahin bin ich weiter im Untergrund