PHP Opcode Caching / Zend Acceleration e include_once vs. require_once
-
03-07-2019 - |
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?
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:
- Molte persone affermano di accelerare qualsiasi applicazione con __autoload .
- Con una cache del codice operativo, evita la condizione obbligatoria_once / include_once (ad esempio nei loop o nel flusso di controllo).
- Alcune persone dicono che /absolute/path/to/file.php in include_ o request_once è più veloce che fare affidamento su include_path.
- 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.