Domanda

Cosa posso fare per aumentare le prestazioni/velocità dei miei script PHP senza installare software sui miei server?

È stato utile?

Soluzione

Profilo.Profilo.Profilo.Non sono sicuro che ci sia qualcosa là fuori per PHP, ma dovrebbe essere semplice scrivere un piccolo strumento per inserire informazioni di profilazione nel codice.Ti consigliamo di profilare i tempi delle funzioni e i tempi delle query SQL.

Quindi, dove hai una funzione:

function foo($stuff) {
    ...
    return ...;
}

Lo cambierei in:

function foo($stuff) {
    trace_push_fn('foo');
    ...
    trace_pop_fn('foo');
    return ...;
}

(Questo è uno di quei casi in cui più rendimenti in una funzione diventano un ostacolo.)

E SQL:

function bar($stuff) {
    trace_push_fn('bar');

    $query = ...;
    trace_push_sql($query);
    mysql_query($query);
    trace_pop_sql($query);

    trace_pop_fn('bar');
    return ...;
}

Alla fine, puoi generare una traccia completa dell'esecuzione del programma e utilizzare tutti i tipi di tecniche per identificare i colli di bottiglia.

Altri suggerimenti

Una tecnica ragionevole che può essere facilmente recuperata è la memorizzazione nella cache.Una grande quantità di tempo tende a essere dedicata alla generazione di risorse per i client che sono comuni tra le richieste (e anche tra i client);l'eliminazione di questo lavoro di runtime può portare a notevoli aumenti di velocità.Puoi scaricare la risorsa generata (o il frammento di risorsa) in un file all'esterno dell'albero web e quindi rileggerla quando necessario.Ovviamente, sarà necessaria una certa profilazione per garantire che ciò sia effettivamente più veloce della rigenerazione: forzare il server Web a tornare regolarmente sul disco può essere dannoso, quindi la risorsa deve davvero essere riutilizzata pesantemente.

Potresti anche essere sorpreso di quanto tempo viene speso all'interno di query di database scritte male;tempo query generate comuni e vedere se possono essere riscritte.La quantità di tempo impiegata nell'esecuzione del codice PHP è generalmente piuttosto limitata, a meno che non si utilizzino algoritmi non ottimali.

Nessuno di questi è limitato a PHP, sebbene alcuni degli approcci/funzioni "magici" di PHP possano proteggere eccessivamente dal pensare a queste preoccupazioni.Ad esempio, di recente ho aggiornato uno script che utilizzava array_search per utilizzare una ricerca binaria su un array ordinato e ho ottenuto la velocità esponenziale prevista.

Considera davvero l'utilizzo del profiler XDebug:aiuta a verificare quanto viene eseguita una determinata funzione rispetto a quanto ti aspetteresti.

Cerco di ridurre le istruzioni migliorando al tempo stesso la leggibilità del codice sostituendo la logica con ricerche di array quando appropriato.È ciò che ha scritto Jeff Atwood in [Il miglior codice è non avere alcun codice][1].

  • Inoltre, evita i loop all'interno di un altro ciclo e le dichiarazioni nidificate If/Else.
  • Funzioni brevi.A volte non è necessario eseguire un sacco di codice quando il valore dei risultati è già noto.
  • Test inutili:

    if (conta($array) === 0) ritorno;

    può anche essere scritto come:

    Se (!$array) ritorno;

    Un'altra chiamata di funzione eliminata!

    [1]: http://www.codinghorror.com/blog/archives/000878.html"Il miglior codice è non avere alcun codice"

Puoi ottimizzare il codice con due cose fondamentali:

Ottimizzazione della libreria e del server associati a PHP

Vai oltre https://www.digitalocean.com/community/articles/how-to-optimize-apache-web-server-performance O

Puoi utilizzare uno strumento di profilazione come xhprof per visualizzare quale parte del tuo codice può essere ottimizzata ed ecco il collegamento da seguire: http://michaelsanford.com/compiling-xhprof-for-php-5-4/

Ottimizzazione del codice utilizzando il profiler del codice e l'analizzatore del codice

È necessario installare Netbeans per utilizzare questo plugin.Ecco i passaggi che devi seguire:

1) Apri NetBeans quindi seleziona l'opzione dalla barra dei menu Strumenti > Plugin.Quindi cerca il nome del plug-in "phpcsmd" nella scheda dei plug-in disponibili e installalo da lì.

2) Ora apri il terminale e sii lì come super utente digitando il comando "sudo su".

3) Installa la libreria PEAR (se non è installata) nel tuo sistema eseguendo i seguenti comandi nel tuo terminale

a) wget http://pear.php.net/go-pear.phar
b) php go-pear.phar

Poiché ne abbiamo bisogno per l'installazione di ulteriori componenti aggiuntivi.

4) Quindi esegui il comando

"pear config-set auto_discover 1"

Questo verrà utilizzato per impostare il rilevamento automatico del percorso su "vero" per i plug-in richiesti.Quindi vengono installati automaticamente nella posizione desiderata.

5) Quindi esegui il comando seguente per installare lo sniffer di codice PHP.

"pear install --alldeps pear/PHP_CodeSniffer"

6) Ora installa PHP Mess Detector eseguendo il comando seguente

"pear install --alldeps phpmd/PHP_PMD"

Se ricevi l'errore "nome pacchetto/file pacchetto non valido "phpmd/PHP_PMD"" durante l'installazione di questo modulo.È necessario utilizzare questo comando "pear channel-discover poetry.phpmd.org" per eliminare questo errore.Dopo questo comando è possibile eseguire nuovamente il comando precedente per installare Mess detector.

7) Ora installa PHP Depend eseguendo il comando seguente

"pear install --alldeps pdepend/PHP_Depend"

8) Ora installa PHP Copy Paste Detector eseguendo il comando seguente

"pear install --alldeps phpunit/phpcpd"

9) Quindi esegui il comando

"pear config-set auto_discover 0"

Questo verrà utilizzato per impostare il percorso di rilevamento automatico su "falso".

10) Quindi aprire net bean e seguire il percorso Strumenti>Opzioni>PHP>PHPCSMD

Non esiste una soluzione magica e tentare di fornire soluzioni generiche potrebbe essere solo una perdita di tempo.

Dove sono i tuoi colli di bottiglia?Ad esempio, i tuoi script utilizzano molto processore/database/memoria?

Hai effettuato qualche profilazione?

includere i file è lento e richiederli è ancora più lento.Se usi __autoload per includere ogni classe, i conti si sommeranno.Per esempio.

Sono sempre un po' diffidente nel cercare di essere troppo intelligente in termini di ottimizzazione del codice, se questo sacrifica la chiarezza del codice.Se hai bisogno di rendere oscuro il codice per renderlo veloce, non sarebbe più economico aggiornare l'hardware invece di perdere tempo cercando di modificare il codice?Dopotutto, i cicli del processore sono più economici dei cicli del programmatore.

Quelli che mi vengono in mente...

  • Invarianti di ciclo sono sempre bravi da guardare.

  • Scrivi un codice conforme a E_STRICT ed E_NOTICE, in particolare se si registra errori.

  • Evita l'operatore @.

  • Percorsi assoluti per richiedere e include.

  • Usa strpos, str_replace ecc.invece delle espressioni regolari quando possibile.

Poi ci sono un sacco di altri metodi che potrebbero funzionare, ma probabilmente non ti daranno molti benefici.

Ogni volta che guardo i problemi di prestazioni, penso che la cosa migliore da fare sia cronometrare il tempo impiegato dalle tue pagine per essere eseguite e poi guardare quelle più lente.Quando ottieni queste metriche reali, puoi spesso migliorare le prestazioni di quelle più lente per ordini di grandezza, correggendo una query SQL lenta o magari rendendo più rigido il codice.

Ciò ovviamente non richiede nuovo hardware o software speciale, ma solo un occhio critico al codice esistente.

Detto questo, funzionerà solo per un certo periodo...se stai davvero ricevendo abbastanza traffico da raggiungere i limiti del tuo hardware e/o c'è del codice che è intrinsecamente lento e davvero richiesto, dovrai considerare altre possibilità.

Sono responsabile di un ampio sistema di segnalazione e teniamo traccia delle segnalazioni più lente in questo modo.Inserisco una chiave univoca nel database all'avvio del rapporto e al termine posso determinare quanto tempo è impiegato.Sto utilizzando il database perché in questo modo posso rilevare il timeout delle pagine (cosa che accade molto più spesso di quanto vorrei)

Segui prima alcuni degli altri consigli come la profilazione e prendere buone decisioni sull'allocazione delle risorse, ad es.memorizzazione nella cache.

Inoltre, prendi in considerazione le prestazioni delle risorse esterne come il tuo database.In MySQL puoi controllare il file registro delle query lento Per esempio.Inoltre assicurati di non aver progettato il tuo database e di non dimenticartene.Ottimizzazione delle query (ancora una volta per MySQL) rispetto ai dati reali può pagare di più.

Rasmus Lerdorf ha dato alcuni buoni consigli nella sua recente presentazione "Semplice è difficile" al FrOSCon '08.Se stai utilizzando una cache bytecode (e dovresti davvero usarne una), includere i mancati percorsi fa molto male, quindi ottimizza il tuo require/require_once.

Puoi utilizzare uno strumento di profilazione come xhprof per vedere quale parte del tuo codice può essere ottimizzata!

1) Utilizza l'ultima versione di PHP

Il team principale sta lavorando duramente per migliorare le prestazioni di PHP in ogni versione.

2) Utilizzare una cache del bytecode

A partire da PHP 5.5 è stata aggiunta una cache di bytecode a PHP denominata OPcache.Utilizzando OPcache può fare un'enorme differenza soprattutto a partire da PHP 7.Riceve miglioramenti in ogni versione di PHP e potrebbe anche ottenere un file Implementazione JIT in futuro.

3) Profilazione

Mentre lo sviluppo della profilazione ti offre una visione approfondita di cosa sta succedendo esattamente.Questo aiuta molto a trovare colli di bottiglia nel tuo codice.

Uno degli strumenti più utilizzati è XHProf ma non è più ufficialmente supportato e presenta problemi con PHP >= 7.Un'alternativa quando vuoi profilare PHP >= 7 è Tideways che è una forchetta di XHProf.

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