[Frage] Extbase Erweiterungen mit schlechter Performance [Gelöst] TYPO3-Version: 6.1.1

  • hartwerk hartwerk
    T3PO
    0 x
    17 Beiträge
    0 Hilfreiche Beiträge
    04. 11. 2013, 15:07

    Hallo zusammen,

    für eine multinationale / mehrsprachige Website wurde eine Erweiterung von uns geschrieben, die Produkte in verschiedenen Sprachen anzeigt. Die Produkte werden als Objekte in Sys-Foldern angelegt, es existiert keine eigenen List/Detail Seiten für die Views, das handelt alles die Erweiterung selbst.
    So weit so gut, die Erweiterung funktioniert, funktional erfüllt sie alle Wünsche.

    Allerdings: die Performance ist mehr schlecht als recht.
    Insgesamt dauert das generieren einer Produktansicht bis zu 10 Sekunden - Messungen haben gezeigt, dass allein das Generieren eines Menübaums für die Produkte in gewählter Sprache über 3 Sekunden benötigt, da ist das parsen in den View noch nicht eingerechnet.

    Meine Frage: greife ich falsch auf die Repositories zu und verlangsame das künstlich? Oder liegt das tiefer in extbase vergraben und ich kann an der Stelle kaum beschleunigen?

    Für jede Hilfe bin ich dankbar.

    Hier der Code, der so zeitintensiv ist - ich kann auch gern die komplette Extension zur Verfügung stellen, wenn es hilfreich ist.

    1. public function build() {
    2.  
    3.  
    4. $this->setSettings();
    5.  
    6.  
    7. $categoryAndProductTree = $this->categoryForProductRepository->findRootCategories();
    8. $productsFirstLevel = array();
    9. foreach ($categoryAndProductTree as $categoryFirstLevel) {
    10.  
    11. // first level
    12. $allProductsFirstLevel = $this->productRepository->findByCategory($categoryFirstLevel, $this->settings['country']);
    13. unset($productsFirstLevel);
    14. foreach ($allProductsFirstLevel as $productFirstLevel) {
    15.  
    16. if ($productFirstLevel->getShowInMenu()) {
    17. $productsFirstLevel[] = $productFirstLevel;
    18. }
    19. }
    20. $categoryFirstLevel->setProducts($productsFirstLevel);
    21.  
    22. // second level
    23. $categoriesSecondLevel = $this->categoryForProductRepository->findChildren($categoryFirstLevel);
    24. $categoryFirstLevel->setChildren($categoriesSecondLevel);
    25. $productsSecondLevel = array();
    26. foreach ($categoriesSecondLevel as $categorySecondLevel) {
    27.  
    28. //\TYPO3\CMS\Core\Utility\DebugUtility::debug($categorySecondLevel->getTitle(), 'title');
    29. $allProductsSecondLevel = $this->productRepository->findByCategory($categorySecondLevel, $this->settings['country']);
    30. unset($productsSecondLevel);
    31.  
    32. foreach ($allProductsSecondLevel as $productSecondLevel) {
    33. if ($productSecondLevel->getShowInMenu()) {
    34. $productsSecondLevel[] = $productSecondLevel;
    35. }
    36. }
    37. $categorySecondLevel->setProducts($productsSecondLevel);
    38.  
    39. // third level
    40. $categoriesThirdLevel = $this->categoryForProductRepository->findChildren($categorySecondLevel);
    41. $categorySecondLevel->setChildren($categoriesThirdLevel);
    42. }
    43. }
    44.  
    45. return $categoryAndProductTree;
    46. }

  • hartwerk hartwerk
    T3PO
    0 x
    17 Beiträge
    0 Hilfreiche Beiträge
    11. 02. 2014, 08:14 - Lösung

    Nachdem wir TYPO von einem "Standard" schnellen Server auf einen WIRKLICH schnellen Server umgezogen haben, wuppt das ganze so wie erwartet, eine weitere Performance-Optimierung war nicht möglich, da die meiste Zeit laut Xdebug ausgaben im Core von Typo verbraucht wurde.

    Mein Fazit: immer die CPU im Auge behalten, wenn es klemmt und notfalls sofort auf einen größeren Server ausweichen.


  • 1
  • rfehling rfehling
    Padawan
    0 x
    44 Beiträge
    3 Hilfreiche Beiträge
    06. 11. 2013, 12:25

    Du möchtest also selbst die ganzen Children setzen.

    Am saubersten ist es, die Setzung der Kategorien bei dir in die CreateAction Methode einer Kategorie einzubauen.

    1. public function createForParentAction(Tx_XXX_Domain_Model_Category $category, Tx_XXX_Domain_Model_Category $parent) {
    2.  
    3. $parent->addChild($category);
    4. $this->categoryRepository->update($parent);
    5. }

    Die TCA könnte dann wie folgend aussehen:

    1. 'parent' => array(
    2. 'exclude' => 1,
    3. 'label' => 'LLL:EXT:XXX/Resources/Private/Language/locallang_db.xml:XXX',
    4. 'config' => array(
    5. 'type' => 'select',
    6. 'foreign_class' => 'Tx_XXX_Domain_Model_Category',
    7. 'foreign_table' => 'tx_xxx_domain_model_category',
    8. 'maxitems' => 1
    9. )
    10. ),

    1. 'children' => array(
    2. 'exclude' => 0,
    3. 'label' => 'LLL:EXT:XXX/Resources/Private/Language/locallang_db.xml:XXX',
    4. 'config' => array(
    5. 'type' => 'inline',
    6. 'foreign_table' => 'tx_xxx_domain_model_category',
    7. 'foreign_field' => 'uid',
    8. 'maxitems' => 9999,
    9. 'appearance' => array(
    10. 'collapse' => 0,
    11. 'newRecordLinkPosition' => 'bottom',
    12. ),
    13. )
    14. ),

    Die Repository-Aufrufe übernimmt eigentlich das TCA für dich.

    Genauer kann ich dir leider nicht helfen, da man im Code nicht so leicht durchsteigt. Am besten wäre es, wenn du hier eine Rekursion baust und das wird immer sehr schnell sehr kompliziert :)

    Hoffe das konnte dir ein wenig weiterhelfen.

    Gruß,
    Ruven

  • hartwerk hartwerk
    T3PO
    0 x
    17 Beiträge
    0 Hilfreiche Beiträge
    11. 02. 2014, 08:14

    Nachdem wir TYPO von einem "Standard" schnellen Server auf einen WIRKLICH schnellen Server umgezogen haben, wuppt das ganze so wie erwartet, eine weitere Performance-Optimierung war nicht möglich, da die meiste Zeit laut Xdebug ausgaben im Core von Typo verbraucht wurde.

    Mein Fazit: immer die CPU im Auge behalten, wenn es klemmt und notfalls sofort auf einen größeren Server ausweichen.

  • 1