T3CB12Großprojekt auf Basis von Extbase/Fluid        Datenmenge: > 1.700.000       Seitenaufbau: < 3 Sekunden
+[werk] - Was machen wir?Agentur - Firmenverbundunabhängig, inhabergeführtTYPO3 & MagentoKiel, Hamburg, Aachen, Köln, Fran...
AgendaVorstellung des ProjektsExtbase QueryGeschwindigkeitFluidProgrammierungWartungFazit
Worum geht’s eigentlich?Austausch von Belegdaten im Extranet:  Zahlungsfälligkeiten  Kontoauszüge  Belege & Buchungshilfe ...
Was war los?Viele Requests  Spalten ausblenden  SortierenGeschwindigkeit (5 bis 35 Sekunden)Alte Programmierung (piBase)Ni...
Das ProjektEhrlich: Kunde wünschte ExtbaseImplementierung neuer FeaturesFlüssigeres Arbeiten (Geschwindigkeit)Weniger SOAP...
Das Projekt(fast) LIVE
Extbase QueryKeine Unterstützung für:  GROUP BY  SUM  SELECT field1, field2Aufbohren des Query- und Typo3Db-Objektes
KE: QueryObjektclass Tx_KeZr_Persistence_Query extends  Tx_Extbase_Persistence_Query {  protected $groupBy = array();  pub...
KE: Typo3DbBackendclass Tx_KeZr_Persistence_Storage_Typo3DbBackend  extends  Tx_Extbase_Persistence_Storage_Typo3DbBackend...
Geschwindigkeit CacheEinrichtung Caching-FrameworkEinrichtung Redis-ServerProgrammierung eines Caching-Objektes  Auch Obje...
Cache-Objektpublic function __construct() {    parent::__construct();    $this->initializeCache();}public function initial...
Geschwindigkeit SOAP-AbfragenSOAP schneller als MySQL  GROUP BY auf MySQL trotz Index zu langsamSOAP-Abfragen werden gecac...
Soap-Objektpublic function SfGetSuppliers($dNr,  $enableColHeader = false) {  $this->initialize();  if(!empty($dNr)) {    ...
Fluid Problemef:format.date mit @timestamp  Datum verschiebt sich um eine Stundef:format.currency  Ein leerer String benöt...
Fluid ViewHelperDurationViewHelper  Wie lange (in ms) benötigt ein Fluidabschnitt?GetValueOfObjectViewHelper  Da {invoice....
DurationViewHelperclass Tx_KeZr_ViewHelpers_DurationViewHelper  extends  Tx_Fluid_Core_ViewHelper_AbstractConditionViewH  ...
Timestamp2DateTimeVHclass  Tx_KeZr_ViewHelpers_Timestamp2DateTimeViewHelpe  r extends  Tx_Fluid_Core_ViewHelper_AbstractCo...
FED ViewHelperSwitchViewHelper  +1000 um den in den Fluidcore zu integrierenIfViewHelper  Alles möglich: &&, ||, Stringver...
AJAXDanke an Alex Kellner  http://pastebin.com/pdYZLjGnConfiguration erstellenNeuer BootstrapAction und Controller angeben...
AJAXclass Tx_KeZr_Ajax_UserConfig {  protected $bootstrap;  protected $configuration = array();  public function __constru...
OOPJeder erdenkliche Bereich hat ein eigenes ObjektZeilen pro Methode drastisch reduziertTeilweise sogar mit TDD (phpUnit)...
ModelleTrotz 1 Tabelle 13 ModelleFür jede Gruppierung ein Modell  Filter mit SelectboxenModelle bauen sich gegenseitig auf...
SicherheitUsed the extbase way (Validatoren)Per TS konfigurierbare Filter pro View    Inkl. DB-Abfragedownload {    varTyp...
Sicherheit GET/POSTpublic function getConstraint($for, $value) {  $filterSettings = $this->settings[filter];  $property = ...
DynamikJede Spalte pro Ansicht per TS konfigurierbarAlternativ stdWrap zubuchbarDirectReturnEigene Variablen definierbar  ...
Dynamik per TSk_name1 {    enabled = 1    field = kName1    directReturn = 1}sum_nettobetrag {    enabled = 1    field = s...
UsabilityAusgeblendete Spalten ohne Neuladen  Dank AJAX dauerhafte SpeicherungSortieren ohne NeuladenÄhnliche Filter werde...
WartungViele Arbeiten direkt über TS möglich (1223)Dank Struktur schnelles Auffinden der richtigen Stelle möglichEinfache ...
MySQLErstellung von 5 Indizies  35 Sekunden ==> 1,5 SekundenFilesorts vermieden bzw. konfiguriertAnalysiert mit set profil...
MySQL Konfigurationkey_bufferinnodb_buffer_pool_sizetmp_table_sizesort_bufferquery_cache_min_res_unitquery_cache_limitread...
FazitDie meisten Ansichten lassen sich in unter 3  Sekunden darstellen. Je nach Filter kann es bis  zu 8 Sekunden dauernDi...
Wir können Extbase!!!1 GroßprojektMehrere kleine individuelle Extbaseextensions3 Extbaseprofis und es werden mehrDoku von ...
Danke ...fürs Zuhörenfür Rückfragenfür Applausan die Communityan die TYPO3-Entwickleran das Catering :-)Magnus Schubert & ...
Upcoming SlideShare
Loading in …5
×

Praesentation TYPO3Camp Berlin Speed mit Extbase

2,045 views

Published on

Einige Codebeispiele sind in der Präsentation abgeschnitten. Ladet Euch die Präsentation herunter und öffnet sie mit LibreOffice 3.5, dann klappt's.

Published in: Technology
  • Be the first to comment

Praesentation TYPO3Camp Berlin Speed mit Extbase

  1. 1. T3CB12Großprojekt auf Basis von Extbase/Fluid Datenmenge: > 1.700.000 Seitenaufbau: < 3 Sekunden
  2. 2. +[werk] - Was machen wir?Agentur - Firmenverbundunabhängig, inhabergeführtTYPO3 & MagentoKiel, Hamburg, Aachen, Köln, Frankfurt, München team:inmedias www.kennziffer.com PAGEmachine Splendid creativestyle
  3. 3. AgendaVorstellung des ProjektsExtbase QueryGeschwindigkeitFluidProgrammierungWartungFazit
  4. 4. Worum geht’s eigentlich?Austausch von Belegdaten im Extranet: Zahlungsfälligkeiten Kontoauszüge Belege & Buchungshilfe Zahlungsavise UmsatzstatistikBelege stehen als pdf/ZIP-Datei zur Verfügung.Alle Daten: drucken, exportieren, herunterladen
  5. 5. Was war los?Viele Requests Spalten ausblenden SortierenGeschwindigkeit (5 bis 35 Sekunden)Alte Programmierung (piBase)Nicht mehr wartbar Schnuckelig → groß → größer → kaputt
  6. 6. Das ProjektEhrlich: Kunde wünschte ExtbaseImplementierung neuer FeaturesFlüssigeres Arbeiten (Geschwindigkeit)Weniger SOAP-AbfragenBesseres Dokumentenmanagement (pdf/zip)
  7. 7. Das Projekt(fast) LIVE
  8. 8. Extbase QueryKeine Unterstützung für: GROUP BY SUM SELECT field1, field2Aufbohren des Query- und Typo3Db-Objektes
  9. 9. KE: QueryObjektclass Tx_KeZr_Persistence_Query extends Tx_Extbase_Persistence_Query { protected $groupBy = array(); public function setGroupBy(array $columns) { $this->groupBy = $columns; return $this; }
  10. 10. KE: Typo3DbBackendclass Tx_KeZr_Persistence_Storage_Typo3DbBackend extends Tx_Extbase_Persistence_Storage_Typo3DbBackend { public function parseQuery(Tx_Extbase_Persistence_QueryInterfac e $query, array &$parameters) { ... $this->parseGroupBy($query->getGroupBy(), $source, $sql); ... } public function buildQuery(array $sql) { ... if (!empty($sql[groupBy])) {
  11. 11. Geschwindigkeit CacheEinrichtung Caching-FrameworkEinrichtung Redis-ServerProgrammierung eines Caching-Objektes Auch Objekte können serialisiert abgelegt werdenCaching von Benutzerdaten
  12. 12. Cache-Objektpublic function __construct() { parent::__construct(); $this->initializeCache();}public function initializeCache() { t3lib_cache::initializeCachingFramework(); try { $this->cache = $GLOBALS[typo3CacheManager]- >getCache(keZr);
  13. 13. Geschwindigkeit SOAP-AbfragenSOAP schneller als MySQL GROUP BY auf MySQL trotz Index zu langsamSOAP-Abfragen werden gecached Cache-ObjektProgrammierung eines SOAP-Objektes
  14. 14. Soap-Objektpublic function SfGetSuppliers($dNr, $enableColHeader = false) { $this->initialize(); if(!empty($dNr)) { if($this->cache->has(suppliers . $dNr)) { return $this->cache->get(suppliers . $dNr); } else { $parameters = array( new SoapParam($this->getPassPhrase(),
  15. 15. Fluid Problemef:format.date mit @timestamp Datum verschiebt sich um eine Stundef:format.currency Ein leerer String benötigt 24ms Ein Floatwert wie 0.00 benötigt 1ms
  16. 16. Fluid ViewHelperDurationViewHelper Wie lange (in ms) benötigt ein Fluidabschnitt?GetValueOfObjectViewHelper Da {invoice.{field}} nicht geht.Timestamp2DateTimeViewHelper @timestamp erzeugt falsche DatumswerteSumColsViewHelper Summiere bestimmte Felder in einem Array/Objekt
  17. 17. DurationViewHelperclass Tx_KeZr_ViewHelpers_DurationViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractConditionViewH elper { public function render($name = ) { $label = $name ? $name : Milliseconds; $start = t3lib_div::milliseconds(); $content = $this->renderChildren(); $end = t3lib_div::milliseconds(); t3lib_utility_Debug::debug($end - $start,
  18. 18. Timestamp2DateTimeVHclass Tx_KeZr_ViewHelpers_Timestamp2DateTimeViewHelpe r extends Tx_Fluid_Core_ViewHelper_AbstractConditionViewH elper { public function render($timestamp = NULL) { if($timestamp === NULL) { $timestamp = $this->renderChildren(); if($timestamp === NULL) { return ;
  19. 19. FED ViewHelperSwitchViewHelper +1000 um den in den Fluidcore zu integrierenIfViewHelper Alles möglich: &&, ||, StringvergleicheExplodeViewHelper CSV ==> Array
  20. 20. AJAXDanke an Alex Kellner http://pastebin.com/pdYZLjGnConfiguration erstellenNeuer BootstrapAction und Controller angebenExtbasebasiert weitercoden...
  21. 21. AJAXclass Tx_KeZr_Ajax_UserConfig { protected $bootstrap; protected $configuration = array(); public function __construct() { $this->configuration = array( pluginName => Pi1, extensionName => KeZr, controller => UserConfig, mvc => array( requestHandlers => array( Tx_Extbase_MVC_Web_FrontendRequestHandler => Tx_Extbase_MVC_Web_FrontendRequestHandler ) ), persistence => array( classes => array( Tx_KeZr_Domain_Model_FeUser => array( mapping => array( tableName => fe_users, recordType => ) ) ) ), settings => array() ); $_POST[tx_kezr_pi1][controller] = UserConfig; $this->bootstrap = new Tx_Extbase_Core_Bootstrap(); } public function addHiddenCol() { $this->configuration[action] = addHiddenCol; $_POST[tx_kezr_pi1][action] = addHiddenCol;
  22. 22. OOPJeder erdenkliche Bereich hat ein eigenes ObjektZeilen pro Methode drastisch reduziertTeilweise sogar mit TDD (phpUnit)Used the extbase way Teilbereiche 3mal neu programmiertAlle Views erben von einer abstrakten KlasseAlle Repositories erben von abstrakter Klasse
  23. 23. ModelleTrotz 1 Tabelle 13 ModelleFür jede Gruppierung ein Modell Filter mit SelectboxenModelle bauen sich gegenseitig auf (extends)
  24. 24. SicherheitUsed the extbase way (Validatoren)Per TS konfigurierbare Filter pro View Inkl. DB-Abfragedownload { varType = string queryType = equals required = 1 override = NULL}
  25. 25. Sicherheit GET/POSTpublic function getConstraint($for, $value) { $filterSettings = $this->settings[filter]; $property = $filterSettings[$for][property] ? $filterSettings[$for][property] : $for; if($filterSettings[$for][required] && empty($value) || $for == posStatus && $value == 1) return false; switch($filterSettings[$for][varType]) { case array: if(!is_array($value)) throw new Tx_Extbase_Exception(The requested GET/POST var has the wrong var type, 1331648203); break; case int: case integer: $value = intval($value); break; case date: if(!$value instanceof DateTime) { $value = $this->date->createDateTimeFromString($value); } break; case string: case text: if(is_string($value)) { $value = htmlspecialchars($value); } break; Default: ... } $query = $this->createQuery(); if($filterSettings[$for][negate]) {
  26. 26. DynamikJede Spalte pro Ansicht per TS konfigurierbarAlternativ stdWrap zubuchbarDirectReturnEigene Variablen definierbar Class, enabled, isCurrency, isSumableJeder Filter als Partial verfügbar (TS)
  27. 27. Dynamik per TSk_name1 { enabled = 1 field = kName1 directReturn = 1}sum_nettobetrag { enabled = 1 field = sumNettobetrag isCurrency = 1
  28. 28. UsabilityAusgeblendete Spalten ohne Neuladen Dank AJAX dauerhafte SpeicherungSortieren ohne NeuladenÄhnliche Filter werden übernommenCSV-Export Dank JS (DataTables)Schneller PDF-Export Dank PreCaching (Redis)
  29. 29. WartungViele Arbeiten direkt über TS möglich (1223)Dank Struktur schnelles Auffinden der richtigen Stelle möglichEinfache Erweiterbarkeit. 1 View = 1 Stunde + individuelle Anpassungen :-)TDD
  30. 30. MySQLErstellung von 5 Indizies 35 Sekunden ==> 1,5 SekundenFilesorts vermieden bzw. konfiguriertAnalysiert mit set profiling=11 Woche MySQL-Konfiguration Inkl. Strukturänderungen Text ==> tinytext ==> varchar/char Int ==> tinyint oder int(2)
  31. 31. MySQL Konfigurationkey_bufferinnodb_buffer_pool_sizetmp_table_sizesort_bufferquery_cache_min_res_unitquery_cache_limitread_rnd_buffer_size
  32. 32. FazitDie meisten Ansichten lassen sich in unter 3 Sekunden darstellen. Je nach Filter kann es bis zu 8 Sekunden dauernDie meisten Wartungsarbeiten lassen sich binnen 15-30 Minuten erledigenErweiterungen/Zusatzwünsche lassen sich Dank Modularität und Struktur besser implementieren
  33. 33. Wir können Extbase!!!1 GroßprojektMehrere kleine individuelle Extbaseextensions3 Extbaseprofis und es werden mehrDoku von Stefan Frömken wird Vorlage für extbase.typo3.org
  34. 34. Danke ...fürs Zuhörenfür Rückfragenfür Applausan die Communityan die TYPO3-Entwickleran das Catering :-)Magnus Schubert & Stefan Frömken | www.kennziffer.com GmbH

×