Prečo a ako optimalizovať?
Nebudeme tu rozpisovať dlhú a pomerne rozsiahlu teóriu, ktorú väčšina z Vás i tak nepochopí a nikdy ju ani nebude potrebovať. V skratke by sa dalo povedať, že optimalizovať PHP sa Vám najviac oplatí vtedy, ak máte pomerne navštevované stránky a chcete urýchliť ich spracovanie.
Optimalizáciou navyše znížite záťaž Vášho webhostingu alebo serveru, ale môžete napr. ušetriť aj na prenose dát a podobne. Optimalizácia teda neprospeje len návštevníkom Vašej stránky, ale z časti poteší aj prevádzkovateľa Vášho webhostingu či serveru.
Samotná optimalizácia PHP skriptov je pomerne rozsiahla a náročná, avšak my si ukážeme len základy, ktoré pozostávajú zo správnych zápisov funkcií, cyklov a podobne. Takto získané vedomosti Vám budú vo väčšine prípadov postačovať, ale nie sú všeliek.
Optimalizácia krok za krokom
Dosť bolo nudných úvodných slov, pristúpme rovno k činu. Postupne si predstavíme niektoré základné tipy a triky ako Váš skript urobiť efektívnejším. Občas si spomenieme zopár stránok, ktoré Vám pomôžu rozšíriť si už nadobudnuté znalosti.
Ako sa do hory volá, tak sa z hory ozýva:
- Pre výstup na obrazovku nepoužívajte
printaleecho, ktoré je o trochu rýchlejšie.
- Ak chcete vypísať viacero premenných, nepoužívajte tento zápis:
echo $premenna1." nejaký text ".$premenna2;
Použite radšej tento:
echo $premenna1, ' nejaký text ', $premenna2;
- Ak Váš výstup neobsahuje premenné, nepoužívajte dvojité úvodzovky
"", ale iba jednoduché' '.
To isté platí aj pre zápisy polí (napr.$pole['clen']), funkcií (napr.include('nastavenia.php');) a podobne. Uľahčíte tak ich spracovanie.
Pre doplnenie si prečítajte aj pár slov o úvodzovkách
Cyklím, cyklíš, cyklíme a podobne:
- Keď používate cyklus
for, nastavte jeho max. hodnotu mimo neho.
Nesprávne:
for ($a = 0; $a < sizeof($pole); ++$a) {
// telo cyklu
}
Správne:
$max = sizeof($pole);
for ($a = 0; $a < $max, ++$a) {
// telo cyklu
}
Podľa testov skrátite spracovanie cyklu v niektorých prípadoch až o polovicu. Prečo? Samotné volanie funkcie potrebuje nejaký čas na spracovanie, takže keď ju použijete v cykle, ktorý spracováva napr. 100 členné pole, tak je táto funkcia volaná až 101krát. Vďaka definovaniu max. hodnoty mimo cyklus je volaná len raz, čo je dosť značný rozdiel.
- Určite si všimli, že sme použili namiesto štandardnej inkrementácie
$a++jej inú podobu:++a$. Tento zápis je rýchlejší, pričom sa jedná o špecifickú vlastnosť jazyka PHP, takže v iných jazykoch to neskúšajte. Keď sa rozhodnete zvyšovať nejakú premennú, určite jej predtým štartovaciu hodnotu. Prvotné navýšenie bude rýchlejšie.
- V absolútnej väčšine prípadov je najrýchlejší cyklus
do-while. Cyklusforje oproti nemu pomalší o 20%.
do {
// telo cyklu
} while ($a > 0);
Hráme sa s premennými:
- Neukladajte do premenných všetko čo Vás napadne.
$premenna = 'Toto je nejaký klasický text';
echo $premenna;
Načo to robiť v dvoch krokoch, keď sa to dá v jednom?
echo 'Toto je nejaký klasický text';
- V prípade, že sa použitiu premennej neviete vyhnúť, ale neskôr ju nevyužijete, použite
unset()Vďaka tomu uvoľníte zabranú pamäť, čo ocení Váš server najmä pri veľkých poliach.
- Vždy, keď sa to dá, používajte
str_replace()namiestoereg_replace()apreg_replace(). Spracovaniestr_replace()je za určitých podmienok viac ako o polovicu rýchlejšie!
- Ak potrebujete rozdeliť reťazec v premennej použite funkciu
explode()namiestosplit().
- Keď pracujete s polom, tak používajte pri určovaní člena jednoduché úvodzovky
' 'namiesto žiadnych. Príklad môžete vidieť vyššie.
Čo sa inam nevošlo:
- Ak chcete zistiť aktuálny čas v Unix podobe, používajte funkciu
time()namiestodate('U').
- Ak je to možné, v podmienkach používajte radšej === (Identické) namiesto == (rovné).
- Keď chcete pripojiť ďalší php súbor, rozhodne nepoužívajte
require_once(). Zároveň používajte celé cesty, čím skrátite čas potrebný na rozlišovanie ciest.
- Potlačovanie chýb pomocou znaku
@výrazne spomaľuje spracovanie celého skriptu.
- Ukončujte svoje sql spojenia, ak ich už nepoužívate
- Ak to nie je potrebné, nepoužívajte PHP skripty. Statické stránky sa spracúvajú niekedy až 10x rýchlejšie ako dynamické.
- Nepoužívajte na všetko OOP, objekty a triedy obsadzujú veľa pamäťových prostriedkov.
- Aktivujte Apache modul mod_gzip, ak je na Vašom serveri dostupný.
- Použitím jednoduchého príkazu
ob_start('ob_gzhandler');na začiatku Vášho skriptu, môžete ušetriť až 80% prenesených dát.
A takto by sme mohli pokračovať ešte veľmi dlho. Tieto tipy a triky sú použiteľné vo väčšine, ak nie vo všetkých prípadoch. Mnohé z nich možno na prvý pohľad nebudú mať žiadny efekt, ale treba si uvedomiť, že každá ušetrená milisekunda je dobrá.
Rada na záver
Ak ste sa už rozhodli optimalizovať, určite si vždy zmerajte čas potrebný na vykonanie skriptu, ako aj jeho jednotlivých častí. Postupným skúšaním rôznych metód a zápisov môžete objaviť, že vo Vašom prípade niektorá funkcia pracuje rýchlejšie ako štandardne. Nebojte sa experimentovať.
V prípade, že Vás zaujímajú ďalšie (rozširujúce) informácie ohľadom optimalizácie PHP, určite si pozrite odkazy nižšie.
Ďalšie zaujímavé informácie:
- Ušetřete až 80 % datového přenosu
- 40 Tips for optimizing your php code
- Tips for faster PHP scripts
- PHP Benchmark tests
Za inšpiráciu ďakujeme Tiborovi Sovišovi