2013-10-20 16 views
8

È preferibile utilizzare classi di fabbrica o chiusure in Zend Framework 2 e perché?Classi di fabbrica e chiusure in Zend Framework 2

So che le chiusure non possono essere serializzate, ma se le restituite dal modulo # getServiceConfig(), ciò non influirà sulla memorizzazione nella cache del resto dei dati di configurazione e le chiusure saranno comunque memorizzate nella cache dell'opcode.

In che modo le prestazioni differiscono nella costruzione di una classe factory rispetto all'esecuzione di una chiusura? PHP esegue il wrapping e l'istanza delle chiusure solo quando le esegui o lo farebbe per ogni chiusura definita nel file di configurazione ad ogni richiesta?

Qualcuno ha confrontato i tempi di esecuzione di ciascun metodo?

Consulta anche:

risposta

11

PHP permette di convertire le funzioni anonime nella configurazione per le istanze della classe chiusura al momento della compilazione in modo che sarebbe fare questo su ogni richiesta . Questo è diverso da create_function che creerà la funzione in fase di esecuzione. Tuttavia, poiché le chiusure fanno questo in fase di compilazione, dovrebbero essere nella cache di opcache e quindi non dovrebbero avere importanza.

In termini dell'impatto delle prestazioni della costruzione di un servizio utilizzando uno stabilimento vs chiusura in primo luogo, è necessario ricordare che il servizio verrà costruito solo una volta per richiesta indipendentemente dal numero di volte che si richiede il servizio. Ho eseguito un rapido punto di riferimento di andare a prendere un servizio utilizzando una chiusura e una fabbrica e qui è quello che ho ottenuto (ho incontrato un paio di volte e tutti i risultati sono stati circa lo stesso valore):

Closure: 0.026999999999999ns 
Factory: 0.30200000000002ns 

Quelli sono nanosecondi, cioè 10 -9 secondi. Fondamentalmente la differenza di prestazioni è così piccola che non vi è alcuna differenza effettiva.

Anche ZF2 non può memorizzare nella cache la configurazione dell'intero modulo con le chiusure. Se utilizzo puramente fabbriche, la mia intera configurazione può essere unita, memorizzata nella cache e un semplice file può essere letto su ogni richiesta piuttosto che preoccuparsi di caricare e unire i file di configurazione ogni volta. Non ho misurato l'impatto sulle prestazioni di questo, ma immagino che sia marginale in ogni caso.

Tuttavia, preferisco le fabbriche principalmente per la leggibilità e la manutenibilità. Con le fabbriche non si finisce con un enorme file di configurazione con tonnellate di chiusure dappertutto.

Certo, le chiusure sono grandi per uno sviluppo rapido, ma se vuoi che il tuo codice sia leggibile e manutenibile, allora direi che tieni d'accordo con le fabbriche.

+2

Informazioni sulla memorizzazione nella cache: tutto con le chiusure dovrebbe andare all'interno di 'getXyzConfig()' della classe del modulo. Solo non-closure-config all'interno di 'module.config.php';) – Sam

+0

Ottima risposta, grazie Tom. – darkangel

+2

Senza contare che tutte le chiusure vengono create su ogni richiesta, ma le classi di fabbrica vengono solo istanziate quando il servizio dietro di esse è effettivamente richiesto. – DASPRiD