TYPO3 eigene Extbase Erweiterung beschleunigen
In diesem Blogbeitrag sind wir ja auf die allgemeine Performanceoptimierung von TYPO3 schon eingegangen. Jetzt will ich mal noch ein paar Tipps geben, wie eine selbst entwickelte Extension beschleunigt werden kann, die auf Extbase aufbaut.
Als Vorwort sollte noch angemerkt werden, dass der normale TYPO3-Cache ausreicht, wenn man nur Content hat, der für alle Besucher gleich ist, also keine Daten an der Session oder an Rechten von FeUser hängen. Aber für aufwändigere Extensions muss man Action im Plug-In als ‘non-cacheable’ eintragen, was dafür sorgt, dass diese Seiten wieder sehr langsam sind.
Falls noch nicht geschehen, kann man den Extbase Cache ab TYPO3 4.6 noch in den Memcache verlegen, dies tut man indem:
$TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extbase_reflection'] = array( 'backend' =>; 't3lib_cache_backend_MemcachedBackend', 'options' =>; array( 'servers' =>; array('localhost:11211'), ) ); $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extbase_object'] = array( 'backend' =>; 't3lib_cache_backend_MemcachedBackend', 'options' =>; array( 'servers' =>; array('localhost:11211'), ) );
in die localconf.php eingefügt wird.
Des Weiteren sollte man in seinen Models genau darauf achten, dass überall Lazy-Loading für die Relation aktiviert ist. Dies wird durch die Annotationen mit “@lazy” ergänzt. Dies sieht dann so aus:
/** * Contact Informations * @lazy * @var Tx_Initos_Domain_Model_Contact */ protected $contact;
Eine weitere Analyse der PHP Ausführung zeigt, dass die Anteile vom Code in der Regel so aufgeteilt sind:
- 40% Extbase Framework
- 20% eigene Extension
- 40% Fluid Template
Dies zeigt, dass die falsche Verwendung von Extbase oder Fluid schnell auf die Performance durchschlagen. Da hilft es nur, geschickt Funktionalität im Controller abzufangen bzw. sich eigene ViewHelper zu definieren um komplexe Schachtelungen von mit und zu unterbinden. Hier kommt man nicht um eine Code-Analyse herum.
Ein weiterer wichtiger Baustein ist, die eigene Extension um einen eigenen Cache zu erweitern. Hierfür gibt es schon eine Anleitung im TYPO3 Wiki.
Wenn Sie mit der Performance von TYPO3 nicht zufrieden sind, analysieren wir für Sie gerne das Problem und beheben es. Nehmen Sie einfach mit uns Kontakt auf.
Anmerkung:
Bei der Performance-Analyse zeigt sich, dass vor allem der Persistence Layer von Extbase sehr langsam ist. Aber wie wir schon erfahren haben, soll in der nächsten Version von Extbase noch mehr Performance rausgeholt werden.
Über Markus Schneider
Markus Schneider ist Experte für Shop- und ERP-Systeme. Er betreut mehrere eCommerce Kunden welche Magento oder Oxid eSales einsetzten. Dabei integriert er nicht nur CMS Systeme wie Joomla, TYPO3 oder WordPress in ihren Shop, sondern beschäftigt sich auch mit dem Einsatz von Warenwirtschaft und deren Prozesse, dabei greift er auf gesammelte Erfahrung von unterschiedlichen System von OpenERP, über Sage bis hin zu SAP zurück.
PDFs in TYPO3 mit Fluid und FPDF erstellen
Bei einem aktuellen Kundenprojekt gab es den Feature-Wunsch, die bestehende Extbase/Fluid -Extension um einen PDF-Export der entsprechenden Daten zu erweitern. Ein Teammitglied ist auf die Idee gekommen FPDF zu verwenden, was es erlaubt, unter PHP schnell PDFs zu erstellen. Die ersten Versuche endeten dann aber darin, dass wir sehr große PHP-Dateien mit zu viel Code hatten. Da haben wir uns gedacht, das muss irgendwie besser gehen und sind auf die Idee gekommen, Fluid zu verwenden und den Code in ViewHelper auszulagern.
Der HauptViewHelper sieht dann so aus:
require('fpdf/fpdf.php'); class Tx_Initos_ViewHelpers_FpfdViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { public function render() { $pdf = new FPDF(); $this->templateVariableContainer->add('fpdf', $pdf); $this->renderChildren(); $pdf->Output('Report', 'I'); $this->templateVariableContainer->remove('fpdf'); exit(); } }
Danach braucht man einen einfachen Helper, um Seiten anzulegen:
class Tx_Initos_ViewHelpers_P_PageViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper { public function render(){ $fpdf = $this->templateVariableContainer->get('fpdf'); $fpdf->AddPage(); $this->renderChildren(); } }
Und einen ViewHelper, um den Text zu erzeugen:
class Tx_Initos_ViewHelpers_P_TextViewHelper extends cTx_Fluid_Core_ViewHelper_AbstractViewHelper { /** * * @param string $text * @param int $width * @param int $height */ public function render($text, $width, $height){ $pdf = $this->templateVariableContainer->get('fpdf'); $pdf->SetFont('Times','I',30); $pdf->SetTextColor(0,0,0); $pdf->Ln(10); $pdf->Cell($width, $height, utf8_decode($text)c, 0, 1, 'L'); $this->renderChildren(); } }
Danach kann man sich ein FluidTemplate bauen:
<f:section name="main"> {namespace initos=Tx_Initos_ViewHelpers} <initos:fpdf> <initos:p.page> <initos:p.text text="Hallo World!" width="120" height="20" /> </initos:p.page> </initos:fpdf> </f:section>
So kann man die gewohnte Fluid-Syntax verwenden, um PDFs zu erstellen, erhält ein übersichtliches Template und vermeidet Code-Doppelungen. Auf zum Weiteren FPDF-ViewHelper bauen.
Über Markus Schneider
Markus Schneider ist Experte für Shop- und ERP-Systeme. Er betreut mehrere eCommerce Kunden welche Magento oder Oxid eSales einsetzten. Dabei integriert er nicht nur CMS Systeme wie Joomla, TYPO3 oder WordPress in ihren Shop, sondern beschäftigt sich auch mit dem Einsatz von Warenwirtschaft und deren Prozesse, dabei greift er auf gesammelte Erfahrung von unterschiedlichen System von OpenERP, über Sage bis hin zu SAP zurück.
TYPO3 Performanceoptimierung
Ein neuer Kunde nutzt TYPO3 als CMS, hat aber einige Probleme mit der Geschwindigkeit. Er fragte uns, ob wir einen Blick auf das System werfen können. Die Maschine entpuppte sich als VMware Instanz mit zwei CPUs, 2 GB Speicher und einem Ubuntu 10.04 LTS. Einige Optimierungen waren bereits umgesetzt, wie beispielsweise die Nutzung von mod_deflate in Apache.
Die initiale Optimierung bestand im Installieren eines PHP-Bytecode-Caches. Da die Ubuntu-LTS-Version kein aktuelles APC mitbringt, installierten wir über “pecl install apc” die neuste Version und aktivierten sie für die Apache Instanz. Die Größe des Caches erhöhten wir durch eintragen der Zeile “apc.shm_size=128M” in der Datei “/etc/php5/conf.d/apc.ini” auf 128MB und im selben Moment erhöhten wir auch die Anzahl des allokierbaren Shared Memories auf 256MB. Dies geschieht für das laufende System durch ausführen von “echo 268435456 > /proc/sys/kernel/shmmax”. Die Änderung wird durch einen Eintrag in die Datei /etc/sysctl.conf über einem Systemneustart persistent gemacht: ”kernel.shmmax=268435456″.
Im nächsten Schritt behoben wir die wichtigsten Google PageSpeed Meldungen. Das größte gemeldete Problem waren die fehlenden Cacheheader für Bilder. Durch das Kommando “a2enmod expires” wird das Modul zum Setzen von Cacheheadern aktiviert und ein Eintrag von:
ExpiresActive On ExpiresDefault "access plus 1 month"
in der Datei “/etc/apache2/mods-enabled/expires.conf” sorgt dafür, dass alle statischen Inhalte für mindestens einen Monat ab dem Zugriff gecached werden. YSlow empfahl noch das deaktivieren des FileETag-Headers, was wir durch Eintrag “FileETag none” in der Datei “/etc/apache2/httpd.conf” auch taten.
Unser letzter Schritt bestand im Aktivieren des installierten Memcached-Servers als Backendcache. Dies wird in der Datei “typo3conf/localconf.php” der TYPO3 Installation durchgeführt, durch Eintragen der Zeilen:
//use memcached backend as cache $TYPO3_CONF_VARS['SYS']['useCachingFramework'] = '1'; $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pages']['backend'] = 't3lib_cache_backend_MemcachedBackend'; $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pages']['options'] = array( 'servers' => array('localhost:11211'), ); $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pagesection']['backend'] = 't3lib_cache_backend_MemcachedBackend'; $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_pagesection']['options'] = array( 'servers' => array('localhost:11211'), ); $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_hash']['backend'] = 't3lib_cache_backend_MemcachedBackend'; $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['cache_hash']['options'] = array( 'servers' => array('localhost:11211'), ); $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['dbal'] = array( 'backend' => 't3lib_cache_backend_MemcachedBackend', 'options' => array( 'servers' => array('localhost:11211'), ) );
Der Kunde war mit der erreichten Performance zufrieden und wir boten ihm noch weitere Optimierungen an:
- Optimierung des MySQL-Servers
- Aufteilen der Bilder- und JS-Dateien auf unterschiedlicher Domains
- Nutzung eines schnelleren Webservers wie nginx für statische Inhalte
- Nutzung von Varnish als Reverse Proxy
Diese Vorschläge will er eventuell in der Zukunft adaptieren.
Über Tobias Kalbitz
Tobias Kalbitz ist Experte für Software Architektur, skalierbare Systeme und Hochverfügbarkeit. Seine Erfahrungen in der Optimierung von Software helfen Kunden regelmäßig ihren Softwarestack und Hardwareressourcen zu konsolidieren.




