of 34 /34
T3CB12 Großprojekt auf Basis von Extbase/Fluid Datenmenge: > 1.700.000 Seitenaufbau: < 3 Sekunden

Praesentation TYPO3Camp Berlin Speed mit Extbase

Embed Size (px)

DESCRIPTION

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

Text of Praesentation TYPO3Camp Berlin Speed mit Extbase

  • 1. T3CB12Groprojekt auf Basis von Extbase/FluidDatenmenge: > 1.700.000 Seitenaufbau: < 3 Sekunden

2. +[werk] - Was machen wir?Agentur - Firmenverbundunabhngig, inhabergefhrtTYPO3 & MagentoKiel, Hamburg, Aachen, Kln, Frankfurt, Mnchenteam:inmediaswww.kennziffer.comPAGEmachineSplendidcreativestyle 3. AgendaVorstellung des ProjektsExtbase QueryGeschwindigkeitFluidProgrammierungWartungFazit 4. Worum gehts eigentlich?Austausch von Belegdaten im Extranet:ZahlungsflligkeitenKontoauszgeBelege & BuchungshilfeZahlungsaviseUmsatzstatistikBelege stehen als pdf/ZIP-Datei zur Verfgung.Alle Daten: drucken, exportieren, herunterladen 5. Was war los?Viele RequestsSpalten ausblendenSortierenGeschwindigkeit (5 bis 35 Sekunden)Alte Programmierung (piBase)Nicht mehr wartbarSchnuckelig gro grer kaputt 6. Das ProjektEhrlich: Kunde wnschte ExtbaseImplementierung neuer FeaturesFlssigeres Arbeiten (Geschwindigkeit)Weniger SOAP-AbfragenBesseres Dokumentenmanagement (pdf/zip) 7. Das Projekt(fast) LIVE 8. Extbase QueryKeine Untersttzung fr:GROUP BYSUMSELECT field1, field2Aufbohren des Query- und Typo3Db-Objektes 9. KE: QueryObjektclass Tx_KeZr_Persistence_Query extendsTx_Extbase_Persistence_Query {protected $groupBy = array();public function setGroupBy(array $columns) {$this->groupBy = $columns;return $this;} 10. KE: Typo3DbBackendclass Tx_KeZr_Persistence_Storage_Typo3DbBackendextendsTx_Extbase_Persistence_Storage_Typo3DbBackend {public functionparseQuery(Tx_Extbase_Persistence_QueryInterface $query, array &$parameters) {...$this->parseGroupBy($query->getGroupBy(),$source, $sql);...}public function buildQuery(array $sql) {...if (!empty($sql[groupBy])) { 11. Geschwindigkeit CacheEinrichtung Caching-FrameworkEinrichtung Redis-ServerProgrammierung eines Caching-ObjektesAuch Objekte knnen serialisiert abgelegt werdenCaching von Benutzerdaten 12. Cache-Objektpublic function __construct() {parent::__construct();$this->initializeCache();}public function initializeCache() {t3lib_cache::initializeCachingFramework();try {$this->cache = $GLOBALS[typo3CacheManager]->getCache(keZr); 13. Geschwindigkeit SOAP-AbfragenSOAP schneller als MySQLGROUP BY auf MySQL trotz Index zu langsamSOAP-Abfragen werden gecachedCache-ObjektProgrammierung eines SOAP-Objektes 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. Fluid Problemef:format.date mit @timestampDatum verschiebt sich um eine Stundef:format.currencyEin leerer String bentigt 24msEin Floatwert wie 0.00 bentigt 1ms 16. Fluid ViewHelperDurationViewHelperWie lange (in ms) bentigt ein Fluidabschnitt?GetValueOfObjectViewHelperDa {invoice.{field}} nicht [email protected] erzeugt falsche DatumswerteSumColsViewHelperSummiere bestimmte Felder in einem Array/Objekt 17. DurationViewHelperclass Tx_KeZr_ViewHelpers_DurationViewHelperextendsTx_Fluid_Core_ViewHelper_AbstractConditionViewHelper {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. Timestamp2DateTimeVHclassTx_KeZr_ViewHelpers_Timestamp2DateTimeViewHelper extendsTx_Fluid_Core_ViewHelper_AbstractConditionViewHelper {public function render($timestamp = NULL) {if($timestamp === NULL) {$timestamp = $this->renderChildren();if($timestamp === NULL) {return ; 19. FED ViewHelperSwitchViewHelper+1000 um den in den Fluidcore zu integrierenIfViewHelperAlles mglich: &&, ||, StringvergleicheExplodeViewHelperCSV ==> Array 20. AJAXDanke an Alex Kellnerhttp://pastebin.com/pdYZLjGnConfiguration erstellenNeuer BootstrapAction und Controller angebenExtbasebasiert weitercoden... 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. OOPJeder erdenkliche Bereich hat ein eigenes ObjektZeilen pro Methode drastisch reduziertTeilweise sogar mit TDD (phpUnit)Used the extbase wayTeilbereiche 3mal neu programmiertAlle Views erben von einer abstrakten KlasseAlle Repositories erben von abstrakter Klasse 23. ModelleTrotz 1 Tabelle 13 ModelleFr jede Gruppierung ein ModellFilter mit SelectboxenModelle bauen sich gegenseitig auf (extends) 24. SicherheitUsed the extbase way (Validatoren)Per TS konfigurierbare Filter pro ViewInkl. DB-Abfragedownload {varType = stringqueryType = equalsrequired = 1override = NULL} 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. DynamikJede Spalte pro Ansicht per TS konfigurierbarAlternativ stdWrap zubuchbarDirectReturnEigene Variablen definierbarClass, enabled, isCurrency, isSumableJeder Filter als Partial verfgbar (TS) 27. Dynamik per TSk_name1 {enabled = 1field = kName1directReturn = 1}sum_nettobetrag {enabled = 1field = sumNettobetragisCurrency = 1 28. UsabilityAusgeblendete Spalten ohne NeuladenDank AJAX dauerhafte SpeicherungSortieren ohne Neuladenhnliche Filter werden bernommenCSV-Export Dank JS (DataTables)Schneller PDF-Export Dank PreCaching (Redis) 29. WartungViele Arbeiten direkt ber TS mglich (1223)Dank Struktur schnelles Auffinden der richtigen Stelle mglichEinfache Erweiterbarkeit. 1 View = 1 Stunde+ individuelle Anpassungen :-)TDD 30. MySQLErstellung von 5 Indizies35 Sekunden ==> 1,5 SekundenFilesorts vermieden bzw. konfiguriertAnalysiert mit set profiling=11 Woche MySQL-KonfigurationInkl. Strukturnderungen Text ==> tinytext ==> varchar/char Int ==> tinyint oder int(2) 31. MySQL Konfigurationkey_bufferinnodb_buffer_pool_sizetmp_table_sizesort_bufferquery_cache_min_res_unitquery_cache_limitread_rnd_buffer_size 32. FazitDie meisten Ansichten lassen sich in unter 3Sekunden darstellen. Je nach Filter kann es biszu 8 Sekunden dauernDie meisten Wartungsarbeiten lassen sich binnen15-30 Minuten erledigenErweiterungen/Zusatzwnsche lassen sich DankModularitt und Struktur besser implementieren 33. Wir knnen Extbase!!!1 GroprojektMehrere kleine individuelle Extbaseextensions3 Extbaseprofis und es werden mehrDoku von Stefan Frmken wird Vorlage fr extbase.typo3.org 34. Danke ...frs Zuhrenfr Rckfragenfr Applausan die Communityan die TYPO3-Entwickleran das Catering :-)Magnus Schubert & Stefan Frmken | www.kennziffer.com GmbH