• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Performance verbessern

yersinia

New member
Hi,
ich verwende ZF 2 und Doctrine 2. Jetzt habe ich aber das Problem, dass der Aufbau meiner Seite laut ZendDeveloperTools ca. 2,5 Sekunden braucht. Die Datenbankabfragen verbrauchen davon, ebenfalls nach ZendDeveloperTools, ca. 40 ms.
Ich verstehe natürlich, dass es schwer ist ohne Code eine Aussage darüber zu treffen, aber ich wollte fragen, ob es irgendwelche allgemeinen Tipps und Tricks zur Performancesteigerung gibt?

Danke und lg

edit:
Zu sagen ist auch noch, dass nur das Rendern einer View (ohne Actions im Controller) ca. 700ms dauert. Das kommt mir auch schon etwas langsam vor oder?
 
Zuletzt bearbeitet:

Kaiuwe

Super-Moderator
Ich verstehe natürlich, dass es schwer ist ohne Code eine Aussage darüber zu treffen, aber ich wollte fragen, ob es irgendwelche allgemeinen Tipps und Tricks zur Performancesteigerung gibt?
Du musst die Ursache/Bremse finden und da würde ich dir einen Profiler empfehlen. Nimm „Xdebug“ und schau dir die Ausführungszeiten an, dann findest du auch den Flaschenhals.
 

yersinia

New member
Danke, werde ich machen. Grad gesehen, dass er eingeschaltet war - jetzt weiß ich auch, wieso meine Festplatte so voll war :D (40 GB Logfiles gelöscht :) ).


Edit:
So ich hab mir das jetzt einmal durchgeschaut und finde mich noch nicht ganz zurecht. Wenn ich mich durchklicke scheint es, als ob er bei EventManager->triggerListeners sehr lange braucht (siehe Screenshot).


Hat da jemand eine Idee?

Edit2: Bild ausgetauscht

Edit3: Wenn ich mir die Overall Ansicht ansehe, braucht der Autoloader lange - könnte das das Problem sein?



Edit4: Problem solved

Ich hatte die ZendToolbar aktiviert und der Profiler braucht sehr lange um die Daten zu verarbeiten. Diese deaktiviert und es geht perfekt.

 
Zuletzt bearbeitet:

dennis!

New member
Ich hake mich hier mal ein und frage: Was ist, wenn die Anwendung auch ohne Zend Toolbar lahm ist? Bei mir ist auch triggerListeners am Langsamsten. Die Seite (auf der augenscheinlich nichts großartiges passiert) lädt sich in > 2 Sekunden. Lokal. Am Rechner kann es eigentlich nicht liegen. Ist ein aktueller i7 mit 8GB RAM und SSD. WIE komme ich jetzt dahinter, wo der Flaschenhals ist?
 

av3nger

New member
Hast du nur die Toolbar deaktiviert oder das komplette Developer Tools-Modul? Letzteres wäre imho besser.

Bei meinem System hatte ich übrigens das Problem, dass die Ladezeit bei aktiviertem Profiling von XDebug spürbar langsamer war.

Ein paar häufig genannte Punkte für die Performance-Optimierung:

- Nutzung der autoload_classmap.php-Dateien (dabei hilft der classmap_generator *)
- Nutzung von template_map.php-Dateien (dabei hilft der templatemap_generator *)
- Caching von Konfigurationsdateien nutzen
- Auf Closures in der Konfiguration verzichten, die gerne bei Factories eingesetzt werden - die sind nicht nur langsamer, sondern haben auch den Nachteil, dass diese nicht gecacht werden können
- bei Nutzung von Doctrine2 ist ebenfalls Caching empfehlenswert, schon auf der Doctrine2-Seite wird der Query Cache empfohlen, darüber hinaus gibt es auch noch den Result Cache und Metadata Cache

* beides in vendor\zendframework\zendframework\bin vorzufinden

Kommt natürlich auch auf den Server an. Soweit ich weiß ist PHP 5.4 z. B. schneller als PHP 5.3; und PHP 5.5 noch schneller, u. a. aufgrund des OPcache. (kann dazu mangels Erfahrung aber nicht viel zu sagen) Ansonsten wird auch gerne auf APC und/oder Memcached zurückgegriffen.

---

Sind jetzt nur ein paar Tipps, um ggf. etwas Leistung rauszuholen. Würde mich aber wundern, wenn es damit von über 2 Sekunden auf unter 1 Sekunde runtergeht. Wie man die cachegrind-Files analysieren/verstehen kann, weiß ich leider auch nicht. Habe irgendwann einfach mal so lange die Zweige aufgeklappt bis ich Methoden gefunden habe, die zu mir gehören, bei denen ich evtl. durch Caching etwas optimieren konnte. Von meinem Wunsch, die Response Time auf unter 300 ms zu senken, bin ich leider noch etwas entfernt.
 

Kaiuwe

Super-Moderator
Bei meinem System hatte ich übrigens das Problem, dass die Ladezeit bei aktiviertem Profiling von XDebug spürbar langsamer war.
Dies betrifft doch nur das Entwicklungssystem und durch einen Debugger und Profiler muss das System mehr Operationen durchführen, daher es muss auch langsamer sein.
Das Aktivieren von XDebug kann aber entsprechend gesteuert werden.

Wie man die cachegrind-Files analysieren/verstehen kann, weiß ich leider auch nicht.
Aber dann zum Zwischenspeichern von Konfigurationsdateien raten?! Das ist doch unsinnig.
Ursachen bekämpfen und nicht Symptome! Mit einem Profiler und einem entsprechenden Programm zur Auswertung können die Ursachen/Flaschenhälse der Anwendung gefunden werden und dann korrekt angegangen werden. Alles andere sind Vermutungen!

Es gibt einige Tutorials im Netz zum Thema Analyse der vom Profiler erzeugten Cachegrind-Dateien.
 

dennis!

New member
Doch, denn dein Rechner, dein lokales Entwicklungssystem und deine Webserver-Konfigurations ist garantiert nicht optimiert für die entsprechende Ausführung.
Ohjemine... du hast natürlich sowas von Recht... :\
Hab mal XDebug komplett deaktiviert und die Requests dauern alle nur noch halb so lange. Und das war ja nur die erstbeste Anpassung. Okay, dann vergesst meinen Einwand mal schnell. Danke!
 

Kaiuwe

Super-Moderator
Hab mal XDebug komplett deaktiviert und die Requests dauern alle nur noch halb so lange.
XDebug kannst du gezielt ein- und ausschalten. (z.B. per URL-Parameter)

Ansonsten musst du bei der Analyse der Profiler-Ergebnisse nur im Hinterkopf behalten, dass die Ausführungszeit (ungefähr) halbiert werden kann. Die Bremsen in deiner Anwendung findest du aber trotzdem, denn die laufen immer noch am längsten, egal wie lang die Gesamtausführung deiner Applikation ist.
 

mondy

New member
Ich hatte mal ein Geschwindigkeitsproblem auf meinem MAC.
Es lag daran, dass ich lokale Seiten mit .local geöffnet habe. Alle Seiten mit .local wurden ca. 2 Sekunden langsamer aufgerufen, als auf einem Windows Rechner. Als ich dann die lokalen Seiten auf .dev umgestellt habe, ging plötzlich alles blitzschnell
 

Troll

New member
moin

da ich bei mir am entwicklungsrechner auch massiv performance probleme habe wollt ich mich hier mal anschliessen

die grössten probleme treten hier bei mir beim ersten start auf. da renne ich eigentlich immer in den 30sek timeout von php

ich hab mir gestern mal xdebug installiert und sah dann heute morgen das schon die ersten paar aufrufe den rechner tod rennen

init() 4sek
und
bootstrap() 22sek

ich habe jetzt schonmal diesen 'classmap_generator' gestartet und werde spätestens morgen früh sehen was draus geworden ist.

aber habt ihr spontan noch einen tip um diese 2 aufrufe zu beschleunigen ?

p,s,
ich bin immer noch zend anfänger :)
also nicht unendlich viele fachwörter und mehr links ;)
 

Kaiuwe

Super-Moderator
init() 4sek
und
bootstrap() 22sek
Das ist nicht vertretbar. Auf einem Entwicklungssystem sollte dies „ms“ und keine „s“ sein –*mit aktiviertem Xdebug und Profiler! Bei der Arbeit mehrere Sekunden warten ist ein Unding.
Das Problem wird nicht mal bei deiner Anwendung liegen, sondern das PHP und dein System schon allein zu lange brauchen. Führe mal einen einfachen Test mit „reinen“ PHP-eigenen Funktionen aus und schau wie lang dies läuft. Solltest du hier ebenfalls im Sekundenbereich sein, dann liegt es tatsächlich an der PHP-Installation oder am Rechner. Es gibt auch erhebliche Unterschiede zwischen den PHP-Versionen, denn eine 5.3 ist bei vielen Sachen einfach komplett einer Version 5.6 unterlegen und kann schon die Skriptlaufzeit oder den Speicher überfordern.
 

michl

New member
Zeig mal spaßeshalber deine Module.php Dateien her. Evtl machst du zu viel in der onBootstrap() Methode.
Für live Umgebungen gibt es da noch einige Stellschrauben an denen du drehen kannst. Die sind allerdings für Dev Umgebungen weniger geeignet. Dazu zählt u.A. der Config-Cache, genauso wie die classmap.
 

Troll

New member
das is nur beim ersten start so. als ob er was cacht . obwohl keinerlei caching genutzt wird bis jetzt

wenn der einmal durchgelaufen ist startet die seite halbwegs flott
reine PHP scripte ... auch komplexere .... sind eher im ms bereich anzutreffen.

ggf kannst du mir ne vernünftige docu für das xdebug empfehlen wo ich dann rausfinden kann was er da genau macht ?!


dies is halt auch mein grösstes problem mit zend ... ich weiss (noch) nicht genau was er macht ... aber das macht er arsch langsam ^^


php ansich ist meiner meinung nach recht optimal konfiguriert.
 

Kaiuwe

Super-Moderator
Zeig mal spaßeshalber deine Module.php Dateien her. Evtl machst du zu viel in der onBootstrap() Methode.
Ob man damit 22 Sekunden begründen kann, ist doch eher fraglich. ;)

Ohh, dies würde ich erstmal ganz weit nach hinten stellen und auch nur nach echten Messungen und Überprüfungen überhaupt in den Betracht ziehen. In der Regel werden hier nur Symptome bekämpft und nicht die Ursache. (Bei PHP-Arrays sowieso fraglich! :p)
 

Troll

New member
hier gerne noch die onBootstrap

zu meiner verteidigung ... ich hab das nicht geschrieben ich muss nur verstehen aufräumen und schneller machen :D

Code:
[COLOR=#000080][B]class [/B][/COLOR]Module [COLOR=#000080][B]implements [/B][/COLOR]ServiceProviderInterface
{
    [COLOR=#000080][B]public function [/B][/COLOR]onBootstrap([COLOR=#660000]$e[/COLOR])
    {
        \Locale::[I]setDefault[/I]([COLOR=#008000][B]'de_DE'[/B][/COLOR]);
        [COLOR=#660000]$app [/COLOR]= [COLOR=#660000]$e[/COLOR]->getApplication();
        [COLOR=#660000]$eventManager [/COLOR]= [COLOR=#660000]$app[/COLOR]->getEventManager();
        [COLOR=#660000]$sm [/COLOR]= [COLOR=#660000]$app[/COLOR]->getServiceManager();
        [COLOR=#660000]$translator [/COLOR]= [COLOR=#660000]$sm[/COLOR]->get([COLOR=#008000][B]'translator'[/B][/COLOR]);
        [COLOR=#660000]$translator[/COLOR]->setLocale([COLOR=#008000][B]'en_US'[/B][/COLOR]);
        [COLOR=#660000]$em  [/COLOR]= [COLOR=#660000]$sm[/COLOR]->get([COLOR=#008000][B]'Doctrine\ORM\EntityManager'[/B][/COLOR]);
        [COLOR=#660000]$dem [/COLOR]= [COLOR=#660000]$em[/COLOR]->getEventManager();
        [COLOR=#660000]$dem[/COLOR]->addEventListener(
            [COLOR=#000080][B]array[/B][/COLOR](
                \Doctrine\ORM\Events::[COLOR=#660e7a][B][I]postLoad[/I][/B][/COLOR],
                \Doctrine\ORM\Events::[COLOR=#660e7a][B][I]prePersist
[/I][/B][/COLOR][COLOR=#660e7a][B][I]            [/I][/B][/COLOR]),
            [COLOR=#000080][B]new [/B][/COLOR]Entity\ServiceManagerListener([COLOR=#660000]$sm[/COLOR])
        );

        [COLOR=#808080][I]// Setup the Zend Logger
[/I][/COLOR][COLOR=#808080][I]        [/I][/COLOR][COLOR=#660000]$logger [/COLOR]= [COLOR=#000080][B]new [/B][/COLOR]Logger();
        [COLOR=#660000]$writer [/COLOR]= [COLOR=#000080][B]new [/B][/COLOR]Stream([COLOR=#008000][B]'./data/log/zsopp.log'[/B][/COLOR]);
        [COLOR=#660000]$logger[/COLOR]->addWriter([COLOR=#660000]$writer[/COLOR]);

        [COLOR=#808080][I]// Attach a logging listener for the log event on application level, working code
[/I][/COLOR][COLOR=#808080][I]        [/I][/COLOR][COLOR=#660000]$events [/COLOR]= StaticEventManager::[I]getInstance[/I]();
        [COLOR=#660000]$events[/COLOR]->attach([COLOR=#008000][B]'*'[/B][/COLOR], [COLOR=#008000][B]'log'[/B][/COLOR], [COLOR=#000080][B]function [/B][/COLOR]([COLOR=#660000]$event[/COLOR]) [COLOR=#000080][B]use [/B][/COLOR]([COLOR=#660000]$logger[/COLOR]) {
            [COLOR=#660000]$target   [/COLOR]= [I]get_class[/I]([COLOR=#660000]$event[/COLOR]->getTarget());
            [COLOR=#660000]$message  [/COLOR]= [COLOR=#660000]$event[/COLOR]->getParam([COLOR=#008000][B]'message'[/B][/COLOR], [COLOR=#008000][B]'No message provided'[/B][/COLOR]);
            [COLOR=#660000]$priority [/COLOR]= (int)[COLOR=#660000]$event[/COLOR]->getParam([COLOR=#008000][B]'priority'[/B][/COLOR], Logger::[COLOR=#660e7a][B][I]INFO[/I][/B][/COLOR]);
            [COLOR=#660000]$message  [/COLOR]= [I]sprintf[/I]([COLOR=#008000][B]'%s: %s'[/B][/COLOR], [COLOR=#660000]$target[/COLOR], [COLOR=#660000]$message[/COLOR]);
            [COLOR=#660000]$logger[/COLOR]->log([COLOR=#660000]$priority[/COLOR], [COLOR=#660000]$message[/COLOR]);
        });


        [COLOR=#808080][I]/*$this->getEventManager()->trigger('log', $this, array(
[/I][/COLOR][COLOR=#808080][I]            'priority' => Logger::DEBUG,
[/I][/COLOR][COLOR=#808080][I]            'message' => 'request->getPost = '
[/I][/COLOR][COLOR=#808080][I]        ));*/
[/I][/COLOR][COLOR=#808080][I]
[/I][/COLOR][COLOR=#808080][I]        //Session
[/I][/COLOR][COLOR=#808080][I]        [/I][/COLOR][COLOR=#660000]$config [/COLOR]= [COLOR=#660000]$e[/COLOR]->getApplication()
            ->getServiceManager()
            ->get([COLOR=#008000][B]'Configuration'[/B][/COLOR]);

        [COLOR=#660000]$sessionConfig [/COLOR]= [COLOR=#000080][B]new [/B][/COLOR]SessionConfig();
        [COLOR=#660000]$sessionConfig[/COLOR]->setOptions([COLOR=#660000]$config[/COLOR][[COLOR=#008000][B]'session'[/B][/COLOR]]);
        [COLOR=#660000]$sessionManager [/COLOR]= [COLOR=#000080][B]new [/B][/COLOR]SessionManager([COLOR=#660000]$sessionConfig[/COLOR], [COLOR=#000080][B]null[/B][/COLOR], [COLOR=#000080][B]null[/B][/COLOR]);
        Container::[I]setDefaultManager[/I]([COLOR=#660000]$sessionManager[/COLOR]);

        [COLOR=#660000]$moduleRouteListener [/COLOR]= [COLOR=#000080][B]new [/B][/COLOR]ModuleRouteListener();
        [COLOR=#660000]$moduleRouteListener[/COLOR]->attach([COLOR=#660000]$eventManager[/COLOR]);
        [COLOR=#660000]$eventManager[/COLOR]->attach([COLOR=#008000][B]'route'[/B][/COLOR], [COLOR=#000080][B]array[/B][/COLOR]([COLOR=#660000]$this[/COLOR], [COLOR=#008000][B]'onRouteFinish'[/B][/COLOR]), -[COLOR=#0000ff]100[/COLOR]);
        [COLOR=#660000]$eventManager[/COLOR]->attach([COLOR=#008000][B]'route'[/B][/COLOR], [COLOR=#000080][B]array[/B][/COLOR]([COLOR=#660000]$this[/COLOR], [COLOR=#008000][B]'onRoute'[/B][/COLOR]), -[COLOR=#0000ff]1000[/COLOR]);

        [COLOR=#660000]$sharedEventManager [/COLOR]= [COLOR=#660000]$eventManager[/COLOR]->getSharedManager();
        [COLOR=#660000]$sharedEventManager[/COLOR]->attach([COLOR=#660e7a][B][I]__NAMESPACE__[/I][/B][/COLOR], [COLOR=#008000][B]'dispatch'[/B][/COLOR], [COLOR=#000080][B]function[/B][/COLOR]([COLOR=#660000]$e[/COLOR]) {
            [COLOR=#660000]$result [/COLOR]= [COLOR=#660000]$e[/COLOR]->getResult();
            [COLOR=#000080][B]if [/B][/COLOR]([COLOR=#660000]$result [/COLOR][COLOR=#000080][B]instanceof [/B][/COLOR]\Zend\View\Model\ViewModel) {
                [COLOR=#000080][B]if [/B][/COLOR]([COLOR=#660000]$e[/COLOR]->getRequest()->getQuery([COLOR=#008000][B]'partial'[/B][/COLOR])) {
                    [COLOR=#660000]$result[/COLOR]->setTerminal([COLOR=#000080][B]true[/B][/COLOR]);
                }
            }
        });

        [COLOR=#660000]$authorize [/COLOR]= [COLOR=#660000]$sm[/COLOR]->get([COLOR=#008000][B]'BjyAuthorize\Service\Authorize'[/B][/COLOR]);
        [COLOR=#660000]$acl [/COLOR]= [COLOR=#660000]$authorize[/COLOR]->getAcl();
        [COLOR=#660000]$roles [/COLOR]= [COLOR=#660000]$authorize[/COLOR]->getIdentityProvider()->getIdentityRoles();
        \Zend\View\Helper\Navigation::[I]setDefaultAcl[/I]([COLOR=#660000]$acl[/COLOR]);
        \Zend\View\Helper\Navigation::[I]setDefaultRole[/I]([COLOR=#660000]$roles[/COLOR][[COLOR=#0000ff]0[/COLOR]]);
    }
 

Troll

New member
hab grade mal nen wenig gebenchmarkt

die onBootstrap läuft aktuell 0.179011 s

was ich ja schon recht langsam finde ....

ich weiss leider nicht wie ich diesen 30 sekunden timeout provozieren kann
 
Oben