Quanto è importante implementare un sistema di caching in un framework in stile MVC?

1

Sto scrivendo il mio framework PHP (... aspetta che i lamenti si placino) ai fini dell'apprendimento (best practice, principi di progettazione, ecc.) poiché sono completamente autodidatta e di conseguenza ci sono delle lacune nel mio conoscenza.

Comprendo che la maggior parte dei framework mainstream incorpora una qualche forma di caching system, che suppongo sia per tenere le classi usate regolarmente e / o altri file nelle vicinanze per un caricamento veloce (giusto?).

Idealmente immagino un sistema che è in qualche modo auto monitoraggio e autogestione in quanto tiene traccia dell'utilizzo di classe / file, dei limiti di memoria e delle prestazioni di elaborazione delle richieste, rimuovendo automaticamente gli elementi dalla cache quando non sono più necessari o aumentando le dimensioni della cache quando anche le prestazioni diminuiscono. basso ecc. (anche qualche forma di garbage collection di base è meglio di niente, giusto?).

Quindi le mie domande sono:

  • In primo luogo: ho capito tutto correttamente finora?

  • Quanto è importante implementare questo tipo di sistema con i metodi include / require regolari?

  • Come posso determinare l'utilizzo della memoria e altre metriche sul rendimento del sistema?

  • Per memorizzare nella cache le classi devo usare i metodi magici '_ sleep ()' e ' _wakeup ()'

  • Ho anche capito che per essere archiviati una classe deve essere serializzata. Dovrei usare una variabile $ _SESSION, una tabella DB temporanea o qualche tipo di file flat / SQLite DB come cache?

Grazie per qualsiasi aiuto / suggerimento.

    
posta Chris 25.07.2012 - 15:42
fonte

3 risposte

3

I understand that most mainstream frameworks incorporate some form of caching system, which I'm guessing is for keeping regularly used classes and/or other files close by for fast loading (right?).

È un po 'più complicato di così; i framework in genere forniscono meccanismi per memorizzare nella cache i risultati di un'intera vista. Per esempio. potresti avere una (sotto) vista che fornisce i primi 5 articoli. Se si consente al framework di sapere che questa vista deve essere restituita solo ogni 5 minuti, proverà a memorizzarla nella prima richiesta. Le richieste successive riceveranno la stessa risposta pre-generata, fino al termine dei cinque minuti. In genere, è anche possibile specificare se questo comportamento è globale o per sessione, quali parametri URL definiscono una richiesta univoca che deve essere memorizzata nella cache, ecc. Si tratta di un'ottimizzazione e in molti casi può fornire grandi vantaggi. La documentazione di Symfony 2 ha una spiegazione molto buona dei principi.

Puoi anche scegliere di mettere in cache le cose a un livello inferiore. Per esempio. il recupero dell'elenco di Paesi dal DB per ogni richiesta è uno spreco di risorse e può essere evitato memorizzando nella cache tale elenco alla prima richiesta. Questo può o meno essere una parte fondamentale di un framework, ma anche in questo caso, non dovresti lanciare il tuo, come altri hanno sottolineato. In generale, la modalità precedente di memorizzazione nella cache sembra essere favorita, poiché impedisce anche l'esecuzione della logica di visualizzazione, un risparmio maggiore.

In termini di come necessario c'è ne; dipende davvero dalla tua situazione. Nella mia esperienza, a meno che non ti aspetti un numero elevato di utenti (ad esempio, più di qualche decina sul tuo sito allo stesso tempo), non hai bisogno di cache. Un sito come StackOverflow, d'altra parte, non sarebbe in grado di funzionare senza una strategia di caching molto ben congegnata.

    
risposta data 25.07.2012 - 16:11
fonte
2

Dalla mia esperienza, il caching è necessario solo quando è molto lento inizializzare alcune classi (ad esempio leggono le informazioni di sistema che impiegano molto tempo per essere elaborate).

Per questi problemi puoi usare il Memcache di PHP. Non ho assolutamente senso inventare un altro meccanismo di memorizzazione nella cache per PHP.

    
risposta data 25.07.2012 - 15:51
fonte
0

Non mi preoccuperei, purché il tempo di esecuzione non sia terribilmente lento. Puoi mantenere gli oggetti nella memoria condivisa se lo desideri, quindi non è necessaria alcuna serializzazione. Questo probabilmente sarebbe anche il modo più elegante.

    
risposta data 25.07.2012 - 15:58
fonte

Leggi altre domande sui tag