Domanda

Ho un collega che sta esaminando la cache del codice operativo / Zend Acceleration (ho sempre pensato che fossero la stessa cosa) per la nostra applicazione basata su PHP. I suoi benchmark sembrano indicare che NON stiamo vedendo un vantaggio in termini di prestazioni se includiamo le nostre (grandi) librerie di classi con request_once, ma vediamo il vantaggio in termini di prestazioni quando utilizziamo include_once.

Questo ha un odore di pesce per entrambi, ma non ho tempo di verificare personalmente la nostra metodologia di riferimento e il mio collega ha più tolleranza per l'odore dei pesci di me. :)

Qualcuno ha mai incontrato qualcosa del genere? In caso contrario, eventuali pensieri su altre cose che potrebbero causare la comparsa di un aumento delle prestazioni passando da include_once a require_once?

È stato utile?

Soluzione

Per cominciare, entrambe le chiamate (request_once e include_once) ricontrollano se un file non è stato incluso prima.

Quindi il modo in cui entrambi ottengono questo è cercando il file in tutti i percorsi disponibili e essenzialmente controllando se non è stato nel mix prima ecc.

In background ciò che accade è che valutano tutte le diverse opzioni (ad es. multiple include_path's, ecc.) e quindi creando il realpath da questa forma abbreviata creano un identificatore univoco. C'è solo uno stesso percorso, non due.

Questo non è già il processo più veloce del pianeta e generalmente si verifica su ogni richiesta con PHP. Quindi aggiungi un'altra operazione costosa che è la stat quando crea quello che ho chiamato realpath (realpath, perché è una specie di cosa realpath () fa) per verificare se il file esiste.

Correggimi se sbaglio, ma APC ha ottimizzazioni soprattutto per questo caso.

Quindi comunque - ora sulla differenza tra require_once e include_once, ovvero che request_once valuta il file (per errori di analisi di basso livello , ecc.) quando lo include. Questo è un controllo aggiuntivo che puoi eliminare se hai abbastanza QA in atto che un errore di analisi non può mai intrufolarsi in un'inclusione.

È difficile trovare altrimenti. : -)

(Qualcosa da considerare: è possibile sviluppare con request_once e sostituire tutte le chiamate con include_once durante la distribuzione.)

Per quanto riguarda una cache del codice operativo, consiglierei APC . È stato discusso in precedenza su StackOverflow. Personalmente, lo sto / lo stiamo usando da un po '(gestiamo circa 100.000 visitatori / giorno con 3 frontend e 1 backend) e siamo molto felici. APC è anche ottimizzato per la follia obbligatoria_once / include_once.

Un effetto collaterale piuttosto interessante è che APC ti consente anche di memorizzare le variabili PHP in memoria - una specie di persistente, ecc.

Un paio di suggerimenti aggiuntivi:

  1. Molte persone affermano di accelerare qualsiasi applicazione con __autoload .
  2. Con una cache del codice operativo, evita la condizione obbligatoria_once / include_once (ad esempio nei loop o nel flusso di controllo).
  3. Alcune persone dicono che /absolute/path/to/file.php in include_ o request_once è più veloce che fare affidamento su include_path.
  4. Anche l'ordine dei percorsi nel percorso include_path è importante.

Spero che sia d'aiuto.

Altri suggerimenti

Non posso garantire nulla in quanto non ho esaminato abbastanza a fondo, ma sì, ho visto differenze di velocità tra i due. Non sono mai stati abbastanza significativi per me per passare a include_once invece di require_once.

Ho sempre pensato che la differenza fosse dovuta al fatto che Require_once deve fare più lavoro sott'acqua. almeno un altro potenziale errore da preparare e gestire e molto altro da fare quando il file richiesto non esiste.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top