Tippek PHP kód optimizálásához

RoliSoft
2010 február 01, hétfõ 14:58

Haladó programozók már figyelnek arra is, hogy a kódjuk milyen hamar fut le és mennyi erőforrást vesz igénybe. Látogatott oldalak esetében fontos, hogy a kód hamar lefusson és kevés erőforrást használjon, így több látogatót tudjon kiszolgálni. Az itt felsorolt tippek egyszerűen betarthatóak és hosszú kód esetén már elég sokat le tudnak faragni a futásidőből:

  • Ha egy osztály lehet statikus is, akkor használd deklaráld mint static class; körülbelül négyszer lesz gyorsabb.
  • Az echo sokkal gyorsabb mint a print.
  • Csökkentheted a memóriahasználatot, azzal, hogy több paramétert adsz meg az echo-nak, ahelyett hogy összeragaszd a stringeket:
    echo '<title>', $oldal['cim'], '</title>';
  • Használd az unset() függvényt, hogy szabadíts fel memóriát. Főleg ha hosszú stringekkel vagy nagy tömbökkel dolgoztál, és már nincs rájuk szükséged.
  • Tartsd magad távol a __get(), __set(), __autoload() meg hasonló megoldásoktól.
  • A require_once() sok erőforrást igényel. Ne használd.
  • Ahol csak lehet használj teljes útvonalakat a fájlokhoz, így nem kell felesleges időt eltöltenie a fordítónak rendszerhívásokkal, hogy megtalálja a teljes útvonalat.
  • Ha meg szeretnéd tudni a kódod mikor kezdte a futását akkor használd a $_SERVER['REQUEST_TIME'] változót, ahelyett hogy újat hozz létre a kódod elején.
  • A reguláris kifejezésekkel sok mindent meg lehet oldani, viszont nagyon lassúak. Próbáld meg először megoldani a problémád a strncasecmp(), strpbrk() vagy stripos() függvényekkel.
  • A str_replace() sokkal gyorsabb mint a preg_replace(), a strtr() viszont négyszer gyorsabb a str_replace() függvénynél.
  • Ha egy függvény, mint például a str_replace(), elfogad tömböt és stringet is paraméterként, a te listád viszont nem nagy és nem változó, akkor inkább többször hívd meg a függvényt, minthogy egy tömböt adj át neki.
  • Jobb ha switch-et használsz sok if/else helyett.
  • A hibaüzenetek elhallgattatására használt @ nagyon lassú.
  • A hibaüzenetek sok erőforrást igényelnek; óvakodj tőlük.
  • Kapcsold be az Apache mod_deflate modulját. Akár 80%-al is összetömörítheti az oldalad, így kevesebb lesz az adatforgalmad.
  • Zárd be az adatbázisaid kapcsolatait miután már nem használod őket vagy a kód végén.
  • Ne használj függvényeket a for() ciklusaidban!
    for($i = 0; $i <= count($tomb); $i++) // A count() meg lesz hívva minden egyes ciklusban!
  • Az $adatok['ar'] hétszer gyorsabb, mint az $adatok[ar].
  • A globális változók kétszer gyorsabbak, mint a helyi változók.
  • A leggyorsabb a helyi változó növelése. Majdnem olyan, mint egy helyi változóval dolgozni egy függvényben.
  • Egy objektum változójának növelése a leglassúbb. Például a $this->valtozo++; háromszor lassúbb mint egy helyi változó növelése.
  • Egy nem deklarált változó növelése tízszer lassúbb, mint egy deklarálté.
  • A jelenlegi osztályban található függvények hamarabb lefutnak, mint a szülő osztályban található függvények.
  • Egy üres függvény egy paraméterrel körülbelül annyi futásidőt használ, mint nyolcszor egy helyi változó növelése.
  • Ha a stringjeid ' közé rakod " helyett, akkor sokkal gyorsabban fognak lefutni, mivel a "-ben a PHP keres változókat is, míg '-ban nem.
  • Egy PHP fájl 2-10x lassabban lesz kiszolgálva az Apache által, és több erőforrást is igényel, mivel lefut a PHP compiler is. Ha a fájl nem tartalmaz PHP kódot, akkor statikus fájlként tárold.
  • A PHP kódjaid minden egyes futásnál le lesznek fordítva és csak utána futtatva. Sok időt és erőforrást takaríthatsz meg, ha telepítsz egy olyan modult amely cache-elni a lefordított kódot, így nem kell minden futásnál újrafordítani. Ilyen például az APC.
  • Cache-elj minél többet. Ahelyett, hogy minden egyes kis adatért kérést küldj az adatbázisodnak (pl MySQL), használj inkább memached-et.
  • Mikor biztos kell légy benne, hogy egy stringnek megvan egy bizonyos hosszúsága, akkor normális esetben meghívod rá a strlen() függvényt. Habár a strlen() egyáltalán nem egy terhelő függvény, mégis egy függvény, és lassú a meghívása a következő trükkhöz képest:
    if(!isset($nev{5})) die('A név rövidebb öt karakternél.');
    Az isset() nem egy függvény, hanem egy nyelvi konstrukció, így sokkal gyorsabb a meghívása.
  • Ha egy változó értékét növeled vagy csökkented, az $i++ lassúbb mint, a ++$i. Ez az érdekesség csak a PHP nyelvben van jelen. Az $i++ meghívásakor a fordító készít egy átmeneti másolatot, megnöveli, majd ezt visszamásolja az eredeti változóba; a ++$i viszont már egyből a kért változó értékét növeli.
  • Nem kell mindent OOP-ban megírj. Sok memóriát használ.
  • Nem kell mindenféle adatnak saját osztályt írj, majd ebben tárold; így nagyon sok memóriát pazarolsz el. Ilyen célra vannak a tömbök.
  • Ha olyan függvényekkel dolgozol, amelyek nagyon sok erőforrást és időt használnak, próbáld meg őket átírni C nyelvre és töltsd be mint PHP kiterjesztést.
  • Használj egy code profilert, mert ezek megmutatják a kódod melyik része a lassú. Ilyen például az xDebug.

Ha még tudsz más trükköt is, akkor írd meg egy hozzászólásban!

Hozzászólások
Jó cikk!
Az érdekelne még, hogy amikor a PHP kódban egy MYSQL queryt teszek be. Ott mennyire mindegy vagy éppen, hogy nem mindegy, hogy milyen kódot küldök el, mert valamikor abszolút nem használok lustaságból aposztrófokat és kíváncsi lennék ez mennyire terheli le a szervert mintha használnék.
Ez teljesen mindegy. Használhatsz kis és nagy betűket, rakhatsz aposztrófokat vagy kihagyhatod őket, egy SQL szerver sem fog ettől leterhelődni.
Aposztrófokat amúgy még a MySQL dokumentációban sem használnak - [url=http://dev.mysql.com/doc/refman/5.1/en/select.html]példa rá[/url] - teljesen fölöslegesek.