2012-03-25 17 views
8

Proprio come in this topic, ho un problema di prestazioni in modalità dev quando si aggiunge un tag "rendering" di ramoscello nella mia app (documentazione correlata: Embedding controllers).Symfony2 e Twig rendono problemi di prestazioni

Senza questo tag di rendering, le mie pagine sono generate in meno di 70 ms. Con il tag di rendering, è almeno 170 ms. E ogni tag di rendering aggiunto nell'app aumenta la generazione della pagina di 100 ms (che è A LOT: perché una pagina normale viene eseguita in 60 ms e un tag di rendering in 100 ms?). Potrei averne bisogno di 4 o 5 su ogni pagina della mia app, quindi ciò significherebbe almeno 500 ms per ogni pagina in modalità dev.

Capisco perfettamente che non ci sono problemi nella modalità prod, ma chiaramente non è comodo nello sviluppo. Quindi qualcuno conosce un modo per sbarazzarsi di chiamate, registri o codici inutili durante l'uso del tag "render" in modalità dev?

risposta

8

Ho explained solo 10 ore fa. Per farla breve: migrare alle estensioni di Twig.

+2

Bene in questo caso la creazione di un servizio per la logica del controller è IMHO migliore. Se la logica del controller ha l'operazione db, penso che sia meglio non spostare la logica nella funzione di ramoscello. La creazione di un servizio separato garantisce anche la res-usabilità se il controller incorporato ha una route collegata e può essere chiamato in modo indipendente. –

+0

Nulla ti impedisce di chiamare i servizi da un'estensione Twig. In effetti, questo è quello che faccio. Non è un problema di questo-VS. Le estensioni My Twig richiamano solo le azioni dei controller definiti come servizi. Quelle azioni sono riutilizzabili senza estensioni Twig. –

+1

Bene, il servizio può anche essere esposto al ramoscello aggiungendo la variabile globale di twig in 'app/config.yml'. Solo un modo diverso per realizzare le cose. Niente di cui discutere in realtà :). –

6

È possibile spostare la logica del controller su un servizio e fare riferimento come variabile globale ramoscello e quindi includere il modello reso dal controller.

Vedere https://stackoverflow.com/a/13245994/982075 per istruzioni.

8

Una delle mie funzioni preferite in symfony è il tag di rendering, che include le chiamate al controller. Tuttavia, il profiler aggiunge un sacco di spese generali a tutte le chiamate di controller, non solo alla velocità ma utilizza molta memoria. Hai alcune opzioni per accelerarlo.

Il profiler scrive tutti i dati in un database SQLite per impostazione predefinita. IIRC sqlite non consente gli inserimenti paralleli, quindi ogni richiesta deve attendere il proprio turno per accedere al db per svuotare i programmi di raccolta dati. Puoi usare il tuo sviluppo db (mysql o qualsiasi altra cosa tu usi) per mantenere i dati del profiler. Un anno fa ho guadagnato molto in termini di velocità.

È inoltre possibile disabilitare il profiler per le richieste secondarie o utilizzare il profiler solo quando si verifica un'eccezione. Vedi the framework config reference per tutti i dettagli.

# config_dev.yaml 
framework: 
    profiler: 
     only_exceptions:  false 
     only_master_requests: false 
     dsn:     sqlite:%kernel.cache_dir%/profiler.db 
+0

Ho avuto il prbl usando render_esi(); in questo caso la soluzione @ m2mdas non è fattibile. – lrkwz

+0

Questo è sicuramente un trucco interessante :-) – MauganRa

2

La scelta dipende dalla vostra applicazione. Credo che i modi più pratici siano:

1) Utilizzare il tag render per i modelli di rendering pesanti e utilizzare la libreria hinclude per caricarli in modo asincrono. Questo è molto utile quando ogni template da renderizzare è "lento" da solo (ad esempio molte connessioni db, testi di grandi dimensioni, ecc.).

2) Eseguire come proposto da m2mdas. Questa è una soluzione molto veloce per casi comuni.

Problemi correlati