2009-07-26 7 views
5

Sto lavorando su una farm di server Web con traffico elevato che fornisce codice PHP dinamico che include circa 100 file sulla maggior parte delle richieste. La cache dell'opcode di APC è abilitata, include_once_override è abilitata, e ho assegnato 64 MB di RAM alla cache, eppure quando cerco un processo di apache lo vedo ancora open() e stat() tutti questi include per ogni richiesta che dovrebbe essere tirato dalla cache. Riesco a vedere nelle statistiche della cache che la cache viene popolata e utilizzata con un hitrate del 100%. Qualcuno può offrire qualche intuizione?APC abilitato ma Apache continua ad aprire i file?

+0

Will, hai benchmarkato il tuo server con e senza include_once_override? – hobodave

+0

Grazie! Sì, ho fatto benchmark con e senza e non ho visto differenze evidenti .. Ora sto vedendo molto meno stat() s dopo aver implementato percorsi assoluti, ma, vedo ancora un accesso() per ogni file che sto includendo, anche con apc.stat = 0. È normale? Perché i file devono essere accessibili a tutti? – Will

+0

Sei sicuro di non vedere solo l'inclusione iniziale del file? Che versione stai usando? APC ha avuto problemi storicamente con include_once_override. Inoltre, per favore modifica la tua domanda originaria con le risposte, invece di usare le risposte. – hobodave

risposta

7

Will, assicurati di utilizzare il percorso completo per ogni inclusione nell'applicazione. Per la documentazione APC:

apc.stat intero

Fare attenzione modificare questa impostazione. Il valore predefinito è on, forzando APC a stat (verificare) lo script su ciascuna richiesta per determinare se è stato modificato. Se è stato modificato, ricompila e memorizza nella cache la nuova versione. Se questa impostazione è disattivata, APC non controlla, il che significa che per forzare APC a ricontrollare i file, il server Web dovrà essere riavviato o la cache dovrà essere cancellata manualmente. Si noti che le configurazioni del server Web FastCGI potrebbero non cancellare la cache al riavvio. Su un server di produzione in cui i file di script cambiano raramente, è possibile ottenere un significativo aumento delle prestazioni con le statistiche disabilitate.

Per i file inclusi/richiesti questa opzione si applica ugualmente, ma si noti che per il percorso relativo include (qualsiasi percorso che non inizia con/su Unix) che APC deve verificare per identificare univocamente il file. Se si utilizza il percorso assoluto, APC può saltare la statistica e utilizzare tale percorso assoluto come identificativo univoco per il file.

Una buona regola per PHP è quello di definire una costante che contiene il percorso completo al progetto in questo modo:

// Assumes __FILE__ is in the root of your project 
define('PATH_PROJECT', realpath(dirname(__FILE__))); 

quindi utilizzare la include in questo modo:

include_once PATH_PROJECT . '/some/dir/file.php'; 

Così hai ancora la comodità dei percorsi relativi, ma stai davvero utilizzando percorsi completi.