2012-11-06 4 views
6

Sto costruendo un framework in cui le istanze del prodotto utilizzano i file framework principali, fino a quando non c'è una copia della propria versione di quel file. Per raggiungere questo obiettivo ho fatto quanto segue:PHP include l'ordine del percorso e la cache di stato

set_include_path(MY_PRODUCT_ROOT.'/' . PATH_SEPARATOR . MY_FRAMEWORK_ROOT.'/'); 

Quindi, se io chiamo include('view-users.php'); cercherà prima in MY_PRODUCT_ROOT per /view-users.php e se questo non è trovato, sarà quindi cercare di MY_FRAMEWORK_ROOT/vista-utenti .php.

Questa procedura sta funzionando molto bene fino a quando non aggiungo i file alla radice del prodotto. So che PHP/Apache sta memorizzando nella cache gli include e si potrebbe pensare di eseguire clearstatcache(true); per cancellare qualsiasi stato di memorizzazione nella cache. PHP probabilmente usa file_exists all'interno di include(); e pensa che il nuovo file non esiste ancora. Ho provato a riavviare Apache senza alcun effetto.

Purtroppo l'esecuzione di clearstatcache(true); non aiuta neanche. Solo una volta che ho eliminato MY_FRAMEWORK_ROOT/file pensa di svuotare la cache e riprovare, trovando così MY_PRODUCT_ROOT/file.

Im un po 'perplesso, so che abbiamo bisogno di aggiornare la comprensione PHP/Apache se il file (s) esiste o no, ma clearstatcache(true); non aiuta ...

Tutte le idee?

UPDATE: Correzione, il riavvio di Apache sembra essere d'aiuto. Ribadisco che questo si verifica solo quando si cerca di aggiungere un file a MY_PRODUCT_ROOT, sovrapporre un file MY_FRAMEWORK_ROOT esistente, per la personalizzazione

UPDATE: ambiente di sviluppo è Zend Server CE PHP 5.3.14 su Windows, l'ambiente di produzione CentOS httpd , PHP 5.3+. Il fatto che Zend Optimizer sia abilitato sul mio ambiente dev potrebbe avere un effetto, Inoltre non usare APC o altri script di cache

+0

Per essere più precisi, il riavvio di apache funziona solo durante la chiamata clearstatcache. Devo effettivamente cancellare il file framework, quindi ricaricare la pagina e rimettere il file framework – Prof83

+1

hai abilitato la cache di apc? (o un'altra cache di optcode) –

+0

Non è stato possibile riprodurre il problema su php-5.3.3 e apache 2.2.16. Potresti specificare più informazioni sul tuo ambiente? – Lars

risposta

2

Zend Optimizer+ accelera l'esecuzione di PHP con la memorizzazione e l'ottimizzazione del codice operativo. Memorizza il codice bytecode precompilato nella memoria condivisa. Ciò elimina le fasi di lettura del codice dal disco e la compila all'accesso futuro. Per ulteriori miglioramenti delle prestazioni, il codice byte memorizzato è ottimizzato per un'esecuzione più rapida.

Si tratta di memorizzare nella cache il contenuto del file trovato negli include, quindi clearstatcache non funziona. Ho disabilitato il mio Zend Optimizer e ora funziona.

+1

Si prega di notare che si può accettare la propria risposta. Inoltre, potresti verificare, se un 'clearstatcache (true, true)' fa una differenza quando Zend Optimizer + è attivo? In caso contrario, dovresti presentare una segnalazione di bug nella homepage del prodotto. – Lars

+0

Grazie a @Lars lo testeremo ... – Prof83