Domanda

Per il nostro gioco online abbiamo scritto tantissime classi e funzioni PHP raggruppate per tema in file e poi cartelle.Alla fine, ora abbiamo tutto il nostro codice backend (livelli di accesso logico e DB) in una serie di file che chiamiamo lib e includiamo le nostre librerie nella nostra GUI (pagine web, livello di presentazione) utilizzando include_once('percorsolib/file.inc').

Il problema è che siamo stati pigri con le inclusioni e la maggior parte delle istruzioni include sono fatte all'interno del nostro file libs, con il risultato che da ogni pagina web, ogni volta che includiamo un file libs, carichiamo effettivamente l'intero libs, file per file.

Ciò ha un impatto significativo sulle prestazioni.Quale sarebbe quindi la soluzione migliore?

  • Rimuovere tutte le istruzioni include dal file libs e chiamare solo quella necessaria dalle pagine web?
  • Fai qualcos'altro ?

Il server utilizza uno stack LAMP classico (PHP5).

MODIFICARE:Abbiamo un mix di funzioni semplici (motivo legacy e la maggior parte del codice) e classi.Quindi il caricamento automatico non sarà sufficiente.

È stato utile?

Soluzione

  • Gestisci tutto manualmente, solo dove necessario
  • Imposta il tuo include_path solo dove deve essere, il valore predefinito è qualcosa come .:/usr/lib/pear/:/usr/lib/php, puntalo solo dove deve essere, php.net/set_include_path
  • Non utilizzare il caricamento automatico, è lento e rende molto più difficili i lavori di cache APC e equivalenti
  • Puoi disattivare l'operazione "stat" in APC, ma devi svuotare manualmente la cache ogni volta che aggiorni i file

Altri suggerimenti

Se hai programmato in modo orientato agli oggetti, puoi utilizzare il file caricamento automatico funzione, che caricherà le classi dai relativi file sorgente su richiesta come le chiami tu.

Modificare:Ho notato che qualcuno ha sottovalutato entrambe le risposte che si riferivano al caricamento automatico.Abbiamo torto?Il sovraccarico della funzione __autoload è troppo elevato per utilizzarlo a fini prestazionali?Se c'è qualcosa che non mi rendo conto di questa tecnica, sarei davvero interessato a sapere di cosa si tratta.

Se vuoi diventare davvero hardcore, fai qualche analisi statica e scopri esattamente quali librerie sono necessarie e quando e includi solo quelle.

Se usi include e non include_once, quindi c'è anche un po' di risparmio di velocità lì.

Detto questo, la risposta di Matt sullo Zend Optimizer è giusta.Se vuoi, prova Advanced PHP Cache (APC), che è una cache opcode e gratuita.Dovrebbe essere nel repository PECL.

Potresti usare spl_autoload_register() o __autoload() per creare tutte le regole di cui hai bisogno per includere i file necessari per le lezioni, tuttavia il caricamento automatico introduce i propri costi generali in termini di prestazioni.Dovrai assicurarti che tutto ciò che usi sia anteposto a tutte le pagine della GUI utilizzando un'impostazione php.ini o una configurazione di Apache.

Per i tuoi file con funzioni generiche, ti suggerisco di racchiuderli in una classe di utilità e di eseguire una semplice ricerca e sostituzione per sostituire tutte le chiamate a function() con util::function(), che ti consentirà quindi di caricare automaticamente queste funzioni (di nuovo, c'è un sovraccarico introdotto nel chiamare un metodo piuttosto che una funzione globale).

Essenzialmente la cosa migliore da fare è rivedere il codice e saldare il debito di progettazione risolvendo i problemi di inclusione.Ciò ti offrirà il massimo vantaggio in termini di prestazioni e ti consentirà di sfruttare al meglio ottimizzatori come eAccelerator, Zend Platform e APC

Ecco un metodo di esempio per caricare elementi in modo dinamico

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

Quello che stai cercando è Estensione PECL mappatura automatica.

Fondamentalmente consente il caricamento automatico con solo un piccolo sovraccarico di caricamento di un file di mappa precalcolato.Puoi anche suddividere il file della mappa se sai che una directory specifica estrarrà solo da determinati file PHP.

Puoi leggere di più a riguardo Qui.

È da un po' che non utilizzo php, ma Zend Optimizer o Cache non dovrebbero essere d'aiuto in questo caso?PHP carica e compila nuovamente tutti i file inclusi per ogni richiesta?

Non sono sicuro che il caricamento automatico sia la risposta.Se questi file sono inclusi, probabilmente sono necessari nella classe che li include, quindi verranno comunque caricati automaticamente.

Utilizza una cache di codice byte (idealmente APC) in modo che PHP non abbia bisogno di analizzare le librerie ad ogni caricamento della pagina.Tieni presente che l'utilizzo del caricamento automatico annullerà i vantaggi dell'utilizzo di una cache del codice byte (puoi leggere ulteriori informazioni a riguardo Qui).

Usare un profilatore.Se provi a ottimizzare senza avere misure, stai lavorando alla cieca.

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