2010-02-19 19 views
36

Una domanda PHP inesperta:PHP include(): Dimensione file e prestazioni

Ho un file di script PHP che ho bisogno di includere su diverse pagine molte volte in molti posti.

Ho la possibilità di rompere il file incluso in diversi file più piccoli e includerli in base alle necessità ... O ... Potrei semplicemente tenere tutto insieme in un singolo file PHP.

Mi chiedo se ci sia un impatto sulle prestazioni dell'utilizzo di un file più grande o più piccolo per include() in questo contesto? Ad esempio, esiste una differenza di prestazioni tra un file da 200 KB e un file da 20 KB?

Grazie.

risposta

43

Ci sarà una differenza, tra un file da 200KB e un file da 20KB ... Ma probabilmente non lo noterete: un file da 200KB non è così grande - e generalmente usate molti file che non sono "piccoli" ", quando stai costruendo una grande applicazione.

Ci sono due cose che richiedono tempo, quando si carica un file .php:

  • Il codice sorgente PHP è "compilato" a "codici operativi" - che è del tutto equivalente a bytecode Java
    • questo viene fatto ogni volta che un file PHP è incluso, per impostazione predefinita
    • Ma, usando un po 'di cache codice operativo come APC, quei codici operativi possono essere tenuti in memoria, e questa roba compilazione non eseguiti ogni volta che un nymore - che è fantastico: significherà meno CPU utilizzata, poiché la compilazione non verrà più eseguita (verrà eseguita solo una volta ogni tanto).
  • I codici operativi sono eseguiti
    • seconda di cosa si script contiene, questo può richiedere un certo tempo, oppure no:
    • Se il file contiene solo funzioni o classi definizioni, questo non ci vorrà molto tempo : nulla verrà eseguito.
    • Se il file contiene le istruzioni, ci vorrà più tempo ^^


Come sidnote: in una situazione generale, è possibile ottenere molto più tempo/CPU/risorse ottimizzando le tue query SQL o l'aggiunta di un meccanismo di memorizzazione nella cache, piuttosto che pensare a quel tipo di cose.

+0

Grazie per la spiegazione aggiunta. – Tom

+0

Prego :-) Buon divertimento! –

+2

Anche con APC, si consideri l'uso di una funzione __autoload personalizzata/spl_autoload_register - Sono stato in grado di includere solo i file di modello in un framework MVC personalizzato in cui è stata richiamata la classe anziché un elenco di tutti i file di modello - questo salvataggio di circa 1ms per file include . Quindi, se il rendering di una pagina è di 80 ms e puoi salvare 20 ms includendo solo ciò che ti serve anche con APC (quando ce ne sono molti inclusi), potrebbe valerne la pena. Inoltre, sono stati necessari solo 10 minuti per l'implementazione. – codercake

1

C'è sicuramente un impatto, quindi assicurati di usare include_once() invece di include(). Potresti prendere in considerazione l'utilizzo di APC che include una cache di inclusione.

+0

ggiroux ... grazie ... e quando il file viene memorizzato nella cache? A meno che non sia una domanda davvero stupida. – Tom

+1

se è memorizzato nella cache, direi che l'impatto è molto minimo, in quanto verrà memorizzato in bytecode precompilato nella memoria condivisa. – ggiroux

+3

include_once() anziché include()? Si prega di espandere su quello; certamente non aggiunge alla velocità di usare include_once per i motivi già menzionati in questa discussione. – Slavic

16

Fare attenzione con include_once() (e anche require_once()), è più costoso da eseguire rispetto a include(). Ogni volta che viene eseguito include_once(), PHP esegue una ricerca su un indice interno di file già inclusi prima di decidere se caricare il file o meno. Più include nell'indice, più lentamente è questa ricerca. Inoltre, quando si utilizza include() o include_once(), provare a utilizzare i percorsi assoluti laddove possibile poiché questo è molto più veloce dei percorsi relativi perché non si sta costringendo PHP a elaborare il percorso assoluto per te. Come ha detto ggiroux, alcune forme di memorizzazione nella cache come APC raccoglieranno enormi ricompense e renderanno preoccupante il numero di chiamate che hai irrilevanti (in gran parte) (a meno che tu non abbia un codice scritto male).

EDIT--

preoccuparsi delle chiamate di cui sopra è solo un problema una volta che si iniziare avere diverse migliaia requires o includes nella vostra base di codice.

+0

Sul Web, ogni 100 ms conta. Non hai bisogno di migliaia di inclusioni per trarne beneficio enormemente. – Pacerier

+0

Cosa ne pensi di questo strano post: https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/ che afferma che ** include_once() ** è in realtà più veloce di **includere()**? – Adam