2016-02-09 15 views
6

Ho un sito Web Symfony2 che sto testando in produzione. Sono andato avanti e cancellato il suo cache perché ho fatto e probabilmente apporterò ulteriori modifiche, tuttavia c'è un piccolo problema:Gestione della cache di Symfony in produzione

Mentre il cache viene cancellato e dico, dopo voglio scaldarlo, qualcuno che accede il sito Web ricostruisce la cache. Questo crea un piccolo problema mentre la cache viene costruita, ma non completamente, mentre metà viene eliminata perché la cancellazione è ancora in corso.

In seguito, la cache viene creata, ma solo una parte di essa. Symfony pensa che la cache sia interamente costruita e venga eseguita senza provare a crearla, ma funziona su una cache parzialmente costruita. Il processo di cancellazione è un po 'lungo (~ 15 sec), quindi in questo lasso di tempo nessuno deve provare a creare la cache accedendo al sito web.

O questo, o la cache è completamente compilata, sovrascrive la vecchia cache e il sistema tratta questi nuovi file come vecchi, ne elimina una parte e altri rimangono. Non del tutto sicuro, non sono sicuro di come controllare questo.

Per esempio, uno degli errori che mi piacerebbe avere è

The directory "D:\xampp\htdocs\med-app\app\app\cache\dev/jms_diextra/metadata" does not exist. 

Se io non userei quel fascio avrei avuto un altro problema di cache da Doctrine. Questo appare in ogni accesso al sito Web fino a quando non elimino di nuovo la cache SENZA chi accede al sito. blocca completamente l'accesso al sito Web e lo rende non funzionale.

Inoltre, per quanto riguarda il riscaldamento? Anche questo richiede un po 'di tempo. Cosa succede se qualcuno accede al sito Web mentre la cache è in fase di riscaldamento? Non crea anche un conflitto?

Come gestire questo problema? Devo chiudere il servizio Apache, svuotare e svuotare la cache e quindi riavviare Apache? Come viene gestito questo sito Web in produzione?

EDIT Qualcosa di interessante che ho scoperto. Il bug si verifica quando elimino la cartella cache/prod. Se cancello il contenuto della cartella senza cancellare la cartella stessa, sembra che il bug non si verifichi. Mi chiedo perché.

+0

preferisco rimuovere la cache con 'sudo rm -rf app/cache/*' penso che sia possibile ridurre il tempo che ci vorrà molto –

+0

Come si cancella la cache manualmente, anche l'aggiornamento deve essere fatto manualmente, altrimenti fai riferimento ai commenti di @johnSmith per aggiornarlo automaticamente in meno tempo o disabilitarlo completamente. – Anil

+0

Non posso usare 'rm' come su Windows con xampp. –

risposta

4

In genere è buona norma bloccare il sito Web in modalità di manutenzione se si stanno eseguendo aggiornamenti o svuotando la cache per qualsiasi altro motivo nella produzione. A volte i servizi di web hosting hanno questa opzione per gestire questo per voi, oppure c'è un nice bundle per gestire facilmente la manutenzione dalla riga di comando.

In questo modo è possibile eliminare in modo sicuro la cache ed essere sicuri che nessuno visiti la pagina e ricostruisca la cache in modo errato.

+0

C'è anche un pacchetto di manutenzione da lexik, credo. Lo consiglieresti anche tu? Ad ogni modo, l'accesso alle pagine di manutenzione generate da questo pacchetto tenta di scrivere o leggere dalla cache? Dal momento che non avrebbe ancora risolto i problemi. –

+0

Non ho esperienza con il bundle di lexik. 'CorleyMaintenanceBundle' ha due modalità, dura e morbida. Stai cercando un blocco hardware, che funzioni a livello di apache/nginx. Il blocco graduale avrebbe comunque accesso alla cache. –

3

Solitamente se è necessario svuotare la cache di Symfony vuol dire che si sta eseguendo l'aggiornamento a una nuova versione, quindi non solo si deve svuotare la cache, ma probabilmente si deve scaricare le risorse ed eseguire altre attività. In questo caso, ciò che ho fatto in passato e che ha funzionato molto bene è trattare ogni versione di produzione come una propria versione e una propria cartella, quindi quando si installa una nuova versione lo si disconnette dal server web e quindi si cambia il tuo server web per indicare la nuova versione quando hai finito. L'ulteriore vantaggio è che se si incasina qualcosa e si deve eseguire un rollback, si torna immediatamente alla versione precedente.

Per esempio, dire la vostra configurazione di Apache ha DocumentRoot sempre punta a una posizione specifica:

DocumentRoot /var/www/mysite/web 

Si potrebbe fare quella radice un link simbolico alla versione più recente:

/var/www/mysite/web -> /var/www/versions/1.0/web 

Ora dire che hai versione 1.1 del tuo sito da installare. È sufficiente installare a /var/www/versions/1.1 - mettere il codice lì, installare i vostri beni, aggiornare la cache, ecc Poi basta cambiare il link simbolico:

/var/www/mysite/web -> /var/www/versions/1.1/web 

Ora, se il sito si blocca orribilmente si può semplicemente puntare di nuovo il collegamento simbolico. Il vantaggio qui è che non ci sono tempi di inattività per il tuo sito ed è facile eseguire il rollback se hai commesso un errore. Per automatizzare questo utilizzo uno script bash che installa una nuova versione e aggiorna i collegamenti simbolici con una serie di comandi connessi tramite &&, quindi se un passaggio dell'installazione fallisce, l'intera installazione non riesce e non sei bloccato tra il limbo della versione.

Certo, ci sono probabilmente modi migliori per fare tutto quanto sopra o modi per automatizzarlo ulteriormente, ma il punto è che se si sta cambiando produzione si vorrà eseguire l'installazione/installazione di Symfony senza lasciare che gli utenti interferiscano con quello .

+0

Hm, mi chiedo se questo può essere fatto anche con Capifony. Tuttavia, il server non diventa troppo gonfio? Devi copiare tutte le immagini e gli upload di 'web' per ogni versione. –

+0

Sì, questo potrebbe sicuramente essere un problema. Voglio dire, i miei siti tendono a non utilizzare praticamente nessuna immagine, quindi l'ingombro complessivo è davvero piccolo, e non mantengo decine di versioni passate o nulla, solo il più recente 2 o 3. Sono sicuro che Capifony sarebbe una buona opzione. .. la distribuzione è meno importante e cerco di farlo appena possibile, così posso concentrarmi sullo sviluppo. –