2012-02-12 13 views
6

Im avendo un problema in cui eseguiamo un aggiornamento per la nostra applicazione web.clearstatcache + include_path + sessions

Dopo che lo script di aggiornamento è stato completato e accedi all'app Web tramite il browser, otteniamo errori di file non trovati su require_once() perché abbiamo spostato alcuni file e PHP ha ancora la vecchia struttura di directory nella cache.

Se per default realpath_cache_ttl è scaduto il valore predefinito di 120 secondi, tutto si risolve da solo, ma ciò non è accettabile per ovvi motivi.

Così ho provato a usare clearstatcache con un successo limitato. Ho creato un file separato (clearstatcache.php) che chiama questa funzione solo (si tratta di un file di una riga), e messo una chiamata ad essa nel nostro script di installazione via ricciolo:

<?php 
clearstatcache(true); 

Questo non sembra funzionare , tuttavia se chiamo questo file tramite il browser, inizia immediatamente a funzionare.

Sto correndo versione PHP 5.3

ho iniziato a guardare le differenze richiesta di intestazione tra il mio browser e ricciolo, e l'unica cosa che posso vedere che potrebbe questione è il cookie PHPSESSID.

Quindi la mia domanda è, l'attuale PHPSESSID importa (non penso che dovrebbe). Sto facendo qualcosa di sbagliato con il mio script ricciolo? Sto usando

curl -L http://localhost/clearstatcache.php 

EDIT: Dopo ulteriori ricerche, ho deciso questo probabilmente ha qualcosa a che fare con più processi in esecuzione apache. clearstatcache cancellerà solo la cache dell'attuale processo di apache: quando il browser sta effettuando una richiesta, un processo Apache diverso serve la richiesta e questo processo ha ancora la vecchia cache.

+0

AFAIK 'realpath_cache_ttl' e' realpath_cache_size' devono interessare solo i percorsi reali, i percorsi del file esistente. Almeno questo è dimostrato dal fatto che ho i valori predefiniti di 120s e 16K su tutti i miei progetti e non ho mai avuto problemi simili. Usi qualche cache Opcode? – zerkms

+0

sei corretto, la cache è per processo. – goat

risposta

1

Dato che la cache è parte del processo figlio di Apache grazie a mod_php, probabilmente la tua soluzione riavvierà il server Apache.

Se si stesse utilizzando FastCGI (sotto Apache o un altro server Web), la soluzione probabilmente riavvierebbe qualsiasi gestore di processo che si stava utilizzando.

Questo passaggio dovrebbe probabilmente diventare parte del piano di implementazione standard. Tieni presente che potrebbero esserci altre cache che potresti dover eliminare.

+0

Downvoter, apprezzerei davvero qualche utile feedback. – Charles

+0

Per quello che posso dire, questa è l'unica soluzione al momento. Se potessi in qualche modo collegarti a ogni processo di apache e clearstatcache, quella sarebbe la soluzione migliore, ma finché non avrò capito come farlo, questa è l'unica soluzione. –

+0

Per quanto ne so, non c'è modo di indirizzare una richiesta HTTP a un figlio Apache specifico. Questo * sarebbe * molto utile. Potresti provare ad aprire tutte le connessioni persistenti quanti sono i bambini Apache, anche se questo probabilmente consumerà più risorse e più tempo di un riavvio sicuro. – Charles

Problemi correlati