Ján Fečík


osobná stránka · blog

Dátum: piatok, 29. marca 2024
Čas: 13:52:22, 1711716742, @578
Meniny má: Miroslav, Mieroslav
IP adresa: 34.229.62.45

Tipy a triky pre optimalizovanie PHP

Pred pár mesiacmi som spísal pár rád na optimalizáciu webu, no nie som žiadny tvorca webových stránok ako na bežiacom páse a ani ním nechcem byť, takže nejaké rady ohľadom HTML, CSS, JS tu isto nenájdete. Síce sa snažím trochu fušovať aj do tohto remesla, ale nie je to moje primárne zameranie. Keďže robím primárne v PHP, tak som spísal pár rád pre optimalizáciu PHP kódu, ktoré sa snáď oplatí prečítať. Chcel som pôvodne tento článok rozdeliť na dva až tri, lebo je toho celkom veľa, ale ak to niekoho zaujíma, tak to bude mať takto celé pekne pohromade. Ak ste vývojár, tak je nevyhnutné, aby ste svoj PHP kód optimalizovali už v samotnom procese vývoja webovej stránky, či aplikácie. Dodržiavanie osvedčených postupov pri programovaní je dobrým východiskovým bodom pre napísanie dobre optimalizovaného kódu či už v PHP, ale aj v inom jazyku. Je taktiež vhodné sa zamerať aj na rýchlosť a zabezpečenie svojej PHP aplikácie a nepodceňovať to.

Tipy a triky pre optimalizovanie webu  ·  Časté chyby pri SEO optimalizácii

Ako prvé by som povedal, že pokiaľ to je technicky možné, tak prejdite na poslednú verziu PHP. Jej výkon v porovnaní s predchádzajúcimi verziami PHP 5.6 a nižšie je neporovnateľne vyšší. Takže pokiaľ to nie je potrebné, tak nepoužívajte staršie už nepodporované verzie PHP a prejdite na novšiu verziu. Nielenže sa vystavujete možnému bezpečnostnému riziku, ale aj pomalšiemu spracovaniu kódu. Podľa viacerých testov je verzia 7 oveľa rýchlejšia ako nižšie verzie a to už máme za dverami PHP 8.Tipy a triky pre optimalizovanie PHPNižšie nájdete niekoľko tipov na optimalizáciu kódu PHP z pohľadu vývojára, ktoré som dal dohromady:

1. Pokúste sa čo najviac používať natívne funkcie PHP (mám na mysli preddefinované funkcie, ktoré už PHP obsahuje) a nestrácajte čas vytváraním svojich vlastných funkcií, s ktorými by ste dosiahli rovnakú funkcionalitu a neboli by možno ani tak optimalizované ako tie natívne v PHP. Napríklad môžete použiť funkciu range(b, k) na získanie poľa abecedy začínajúcich od b do k, namiesto deklarovania poľa s týmito hodnotami vo funkcii.

2. Ak môže byť metóda statická, tak ju deklarujte ako statickú a bude 4 krát rýchlejšia ako predtým.

3. $row['id'] bude 7 krát rýchlejšie ako $row[id].

4. "echo" je rýchlejšie ako "print" a ešte rýchlejšie by bolo nahradiť zreťazené reťazce viacerými parametrami ako napr. "echo ($str1, $str2, $str3)". Môžete tiež použiť sprintf namiesto premenných obsiahnutých v úvodzovkách, je to asi 10 krát rýchlejšie.

5. Nahraďte dvojité úvodzovky jednoduchými a rýchlosť spracovania bude rýchlejšia. PHP musí prehľadávať a kontrolovať prítomnosť premennej a tým pádom to zaberá viac času pre spracovanie reťazca, ktorý je obklopený dvojitými úvodzovkami a nie jednoduchými. Toto platí pri funkcii echo, takže pokiaľ nepotrebujete v nejakom texte vypisovať premennú, tak používajte jednoduché úvodzovky namiesto dvojitých úvodzoviek. Použite jednoduché úvodzovky pre dlhé reťazce, kde to má samozrejme zmysel. PHP kód je analyzovaný a kompilovaný, takže akýkoľvek možný rozdiel v rýchlosti medzi spracovaním " a ' je naozaj zanedbateľný, pokiaľ nepracujete so stovkami megabajtových reťazcov vložených do vášho kódu.

6. Používajte v podmienkach === namiesto ==, pretože prvý spôsob kontroluje striktne uzavretý rozsah, ktorý ho robí rýchlejším.

7. Pred vykonaním cyklu nastavte maximálnu hodnotu pre cyklus „for“, nepočítajte maximálnu hodnotu pre každý cyklus zvlášť priamo v cykle „for“, ináč v takom prípade radšej použite cyklus „foreach“. Pre mnohých ľudí je bežná vec iterovať pomocou poľa, pričom kód môže byť pomalý, pretože veľkosť poľa sa počíta pri každej iterácii. Toto je vhodné optimalizovať tak, že si veľkosť poľa vypočítame pred samotným cyklom. Nepoužívajte vo vnútri cyklu „for“ funkcie, ako napr. "for ($x = 0; $x < count($array); $x++)", pretože funkcia count() sa zavolá pri každej iterácii. Nastavte si teda maximálny počet iterácii pred cyklom a nie počas jeho vykonávania.

8. Robte svoje funkcie viac flexibilné, aby sa jedna funkcia dala použiť pre rôzne druhy parametrov.

9. Neuzatvárajte PHP skript pomocou „?>“, ušetrí to veľa problémov

10. Pri zobrazení iného výstupu ako HTML používajte správne hlavičky v PHP kóde pomocou funkcie header().

11. Spracujte polia rýchlo pomocou funkcie array_map(), napr. $arr = array_map('trim', $arr); použije funkciu trim() na každý prvok.

12. Používajte filter_var() na overovanie domény, e-mailovej adresy, IP adresy a pod. namiesto regulárnych výrazov.

13. Nespoliehajte sa na set_time_limit(). Nie vždy to môže fungovať a akákoľvek operácia, ktorá je mimo skriptu ako napr. sockety, databáza nebude pod kontrolou set_time_limit().

14. Odstráňte zbytočné a nepoužívané premenné, aby ste uvoľnili pamäť, najmä ak ide o veľké polia.

15. Dajte si pozor a zbytočne nepoužívajte metódy _get, _set, _autoload.

16. Používajte absolútnu cestu pre zahrnuté súbory v PHP kóde. Skráti sa tým čas a vyžaduje menej času stráveného riešením problémov v operačnom systéme.

17. Ak potrebujete zistiť čas, kedy bol PHP skript spustený, tak namiesto funkcie „time()“ uprednostníte $_SERVER[’REQUEST_TIME’].

18. Nepoužívajte regulárne výrazy, ak pre operácie s reťazcami stačia vstavané funkcie PHP na dosiahnutie rovnakej funkcionality.

19. Funkcia str_replace() je rýchlejšia ako funkcia preg_replace(), ale vykonávanie funkcie strtr() je 4 krát efektívnejšie ako funkcia str_replace().

20. Viac sa odporúča používať switch() namiesto viacerých príkazov if, else if, ale to moc nedáva zmysel, keďže switch() robí v zásade to isté. Funkciu switch() by som použil keď sa viac hodí ako podmienky pomocou if, else if a to iste naopak, čiže záleží podľa situácie. Každopádne najčastejšie používané výrazy vo funkcii switch() použite na začiatku, toto sa týka aj podmienok if, else if.

21. Používanie znaku @ na potláčanie a schovávanie informácií o chybách je neefektívne a veľmi pomalé.

22. Ak ste počas procesu vývoja napísali množstvo vlastných funkcií na zaznamenávanie chýb a varovaní, nezabudnite ich odstrániť pred nasadením do produkčného prostredia. Vypisovanie potenciálne citlivých chybových správ používateľom pomocou funkcie error_reporting() používajte len počas vývoja a ladenia, ináč nastavte 0. Zvýši sa tým rýchlosť spracovania, šetrí to pamäť a je tu taktiež otázka bezpečnosti. V ideálnom prípade by hlásenie chýb malo byť na produkčnom serveri úplne zakázané v rámci súboru php.ini. Ak ste však na zdieľanom webhostingu a nemáte možnosť editovať php.ini, tak najlepšie bude pridať error_reporting(0); ako prvý riadok v každom PHP skripte. Toto zabráni zobrazeniu potenciálne citlivých SQL dotazov, názvov ciest a iných citlivých informácií.

23. Pokúste sa znížiť počet pripojení do databázy a robte dotazy viac agregované, aby ste sa pripájali do databázy menej krát. V PHP skripte použite len jedno pripojenie do databázy. Otvorte pripojenie hneď na začiatku PHP skriptu a používajte ho až do konca. Na konci PHP skriptu ho zatvorte, Neotvárajte pripojenia napr. vo vnútri funkcií, šetrí to pamäť.

24. Prírastok lokálnej premennej vo funkciách je najrýchlejší spôsob.

25. Prírastok globálnej premennej je 2 krát pomalší ako prírastok lokálnej premennej.

26. Prírastok vlastnosti objektu (napr. $this->prop++) je 3 krát pomalší ako prírastok lokálnej premennej.

27. Prírastok nedefinovanej lokálnej premennej je 9 až 10 krát pomalší ako prírastok preddefinovanej lokálnej premennej.

28. Deklarovanie nepotrebnej lokálnej premennej, ktorú nemožno použiť vo funkcii, zníži rýchlosť vykonávania. Deklarovanie nepotrebnej globálnej premennej bez jej použitia vo funkcii tiež spomalí približne o rovnaký čas ako prírastok lokálnej premennej. PHP pravdepodobne kontroluje existenciu premennej.

29. Rýchlosť vykonávania metód nie je ovplyvnená počtom metód definovaných v triede. Ak teda v triede definujete 10 metód, bude ich výkon stále rovnaký.

30. Funkcie definované v odvodených triedach sa vykonajú rýchlejšie ako funkcie v základných triedach.

31. Vykonanie prázdnej metódy s jedným parametrom bude vykonávať rovnaký čas ako prírastok lokálnej premennej 7 až 8 krát a zároveň rovnaká funkcia bude vykonávať rovnaký čas ako 15 násobné zvýšenie lokálnej premennej.

32. Ak sa skripty nedajú uložiť do cache pamäte, vykonávajú sa pre každé spustenie. Je potrebné použiť integrovaný mechanizmus vyrovnávacej pamäte PHP. Znížia sa tak nároky na kompiláciu scriptu a výkon sa zvýši. Používanie OPcache zvyčajne zvýši výkon o 25 - 100%, keďže sa PHP skripty zakaždým kompilujú, pokiaľ nie sú uložené v medzipamäti.

33. Ak je to možné, tak používajte Memcache. Memcache je distribuovaná pamäťová cache databáza, resp. key = value databáza a patrí k najpopulárnejším technológiám na akceleráciu. Do tejto databázy sa uloží pod určitým kľúčom nejaká hodnota a následne sa pomocou daného kľúča táto uložená hodnota vytiahne. Memcache sa najčastejšie používa na ukladanie výsledkov z databázy, ktoré chceme cacheovať a nie je nutné ich pri každom načítaní znovu vyťahovať z databázy (MySQL, PostgreSQL, …), takže sa používa na zrýchlenie dynamických webových aplikácií a zníženie zaťaženia databázy.

34. Pri zvyšovaní alebo znižovaní premennej $i bude $i++ pomalšie ako ++$i. Tento rozdiel je jedinečný pre PHP, nie je použiteľný pre iné jazyky.

35. Nie všetko musí byť riešené pomocou OOP (Objektovo orientované programovanie), takže to nie je modla a povinnosť, pretože OOP spotrebuje viac zdrojov a často je to aj zbytočné. Každé volanie metódy a objektu spotrebuje veľa pamäte.

36. Zamerajte sa aj na používanie MVC (Model View Controller) aby ste oddelili PHP kód od HTML kódu.

37. Nie je povinné definovať dátovú štruktúru podľa tried, polia to tiež dokážu.

38. Podľa potreby rozdeľte kód na metódy, ale metódy príliš nerozdeľujte. Myslite na to, ktorý kód skutočne znova použijete.

39. Ak máte v kóde veľa časovo náročných funkcií, zvážte ich napísanie ako rozšírenie C.

40. Ak je to možné, využite naplno file_get_contents() ako náhradu za file(), fopen(), feof(), fgets() a ďalších funkcií súvisiacich so súbormi. Je to najefektívnejšia funkcia na prácu so súbormi. No pri pokuse otvorenia súboru cez URL pomocou file_get_contents() je potrebné si pozrieť problémy ktoré môžu nastať. Osobne by som pri potrebe otvárať niečo cez URL použil skôr cURL, ktorý má možnosť lepšieho nastavovania a je na tom určite lepšie. Funkcie fopen() a file_get_contents() vykonávajú DNS dotaz pre každú požiadavku, pričom cURL si automaticky ukladá DNS dotazy do medzipamäte. Toto výrazne znižuje počet DNS dotazov a výkon cURL je oveľa lepší ako pri funkcii fopen() či file_get_contents(). cURL dokáže navyše simulovať rôzne requesty, ako napr. odoslanie formulára a teda si request prispôsobiť podľa svojich potrieb. V prípade ak by som chcel rýchlosť bez možnosti lepších nastavení ako ma cURL, tak by som zvolil funkciu fsockopen() (je veľmi výkonná, ale na relatívne nízkej úrovni), aj keď tá je vhodnejšia ak je potrebné robiť niečo so sieťovým pripojením.

41. Pred zapisovaním akýchkoľvek súborov skontrolujte pomocou funkcie is_writable() či má právo spustený PHP skript doňho zapisovať.

42. Nepoužívajte pri odoslaní formuláru kontrolu tlačidla, či sa volá napr. Uložiť. Namiesto toho kontrolujte existenciu tlačidla submit cez funkciu isset() a taktiež či sa $ _SERVER ['REQUEST_METHOD'] == 'POST'.

43. Optimalizujte SQL dotazy SELECT a robte menej operácií s dotazmi INSERT a UPDATE, pokiaľ je to možné.

44. Nedeklarujte v cykloch žiadnu premennú, najmä globálnu premennú, či objekt.

45. Nepoužívajte vnorené cykly na priraďovanie hodnôt pre viacrozmerné pole, pokiaľ je to možné.

46. Výkonnosť cyklu „foreach“ je oveľa vyššia ako pri cykle „while“ alebo „for“.

47. Výraz „i = i + 1“ nahraďte výrazom „i += 1“, bude v súlade so zvykmi v C / C ++ a bude efektívnejší.

48. Globálne premenné by mali zaniknúť pomocou unset(), keď sa stanú nepotrebnými.

49. Vo viacerých vnorených cykloch vložte čo najdlhší cyklus dovnútra a najkratší cyklus von, tým sa čas a výkon aplikácie optimalizuje.

50. Pri práci s webovými službami používajte výhradne JSON namiesto XML, pretože existujú natívne PHP funkcie ako json_encode() a json_decode(), ktoré sú veľmi rýchle. Ak musíte mať formu údajov XML, potom ju namiesto manipulácie s DOM analyzujte pomocou regulárneho výrazu.

51. Používajte proxy na prístup k webovým službám (XML alebo JSOM) na cudzích doménach pomocou XMLHttp, aby ste sa vyhli chybám medzi doménami. napr. domena1.sk <–> XMLHttp <–> domena2.sk.

52. Skúste namiesto regulárnych výrazov použiť strncasecmp(), strpbrk() a stripos().

53. Vyhodnoťte a skontrolujte svoj PHP kód. Xdebug vám ukáže, ktoré časti PHP kódu zaberajú koľko času.

54. Na ukladanie IP adries ako celých čísel namiesto reťazcov v databáze používajte funkcie ip2long() a long2ip(). Toto zníži úložný priestor takmer o štvornásobok (15 bajtov pre char(15) oproti 4 bajtom pre celé číslo). Tiež to uľahčí výpočet či určitá adresa spadá do nejakého rozsahu, no zároveň urýchli vyhľadávanie a triedenie (niekedy o dosť).

55. Čiastočne overte e-mailové adresy kontrolovaním existencie názvu domény pomocou funkcie checkdnsrr(). Táto vstavaná funkcia kontroluje DNS záznamy zadanej domény.

56. Vyvarujte sa problému s vložením hlavičky funkcie mail().

57. Naučte sa používať ternárneho operátora, napr. $action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

58. Použite gzcompress() a gzuncompress() na priehľadnú kompresiu / dekompresiu veľkých reťazcov pred ich uložením do databázy. Tieto vstavané funkcie používajú algoritmus gzip a môžu komprimovať holý text až do 90%.

59. Automaticky zobrazujte pekne naformátovanú kópiu zdrojového kódu stránky pomocou highlight_file(). Táto funkcia je užitočná, keď potrebujete požiadať o pomoc so skriptom na napr. diskusnom fóre, IRC atď.

60. Použite na odosielanie metódu POST pred GET pre všetky hodnoty, ktoré majú skončiť v databáze z dôvodu výkonu paketu TCP / IP.

61. Na testovanie typov hodnôt formulárov z dôvodu výkonu používajte nad regulárnym výrazom ctype_alnum, ctype_alpha a ctype_digit.

62. Používajte require / include namiesto require_once / include_once, aby ste zabezpečili správne ukladanie operačného kódu. require_once() vyžaduje viac zdrojov.

63. Konfigurácia parametrov (v php.ini) má vplyv aj na výkon webu.

a) "disabled functions =" - Táto možnosť sa používa na definovanie deaktivovaných funkcií. Niektoré funkcie môžu priamo vykonávať niektoré skripty na systémovej vrstve, takže sú spojené s veľkým rizikom. Vhodné je zakázať tieto funkcie: disable_functions = phpinfo,passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status (Pokiaľ potrebujete kontrolu stavu systému tak tieto nevypínajte: shell_exec, proc_open, proc_get_status, atď).

b) "max_execution_time = 30" - Tu môžeme definovať maximálny čas vykonania spusteného PHP skriptu. Ak bol požadovaný PHP skript a jeho činnosť nie je dokončená počas max_execution_time, PHP sa nevykoná. Na strane klienta sa vráti chyba časového limitu. Predvolená hodnota je 30 sekúnd. Ak je to potrebné, tak hodnotu zvýšte.

c) "memory_limit = 8M" - Táto možnosť definuje maximálnu pamäť na vykonávanie PHP skriptov, predvolená hodnota je 8 MB. Ak má server viac ako 1 GB pamäte, je lepšie ho zmeniť na 12 MB, aby ste dosiahli lepšiu efektivitu.

d) "register_globals = off" - Táto možnosť umožňuje automatickú registráciu globálnych premenných. Z bezpečnostných dôvodov je táto možnosť predvolene vypnutá.

e) "upload_max_filesize = 2M" - Táto možnosť definuje maximálnu veľkosť súboru, ktorý môžeme nahrať pomocou PHP. Jeho predvolená hodnota je 2 MB. Zväčšite veľkosť ak je to potrebné.

f) "session.save_path" - Ak je v PHP skripte použitá funkcia session, tak je lepšie definovať cestu jej uloženia ako „/dev/shm“. „/dev/shm“ je konkrétny súborový systém TMPFS pre Linux, založený predovšetkým na ukladaní do pamäte, je lepší ako RAMDISK.

64. Spracovanie PHP skriptu pomocou Apache bude 2 až 10 krát pomalšie ako spracovanie statickej stránky HTML. Používajte viac statických stránok HTML, ak je to možné a menej PHP skriptov, pokiaľ to je možné. Je vhodné čo najviac cacheovať a zobrazovať už spracovaný HTML výstup.

65. Ak chcete zvýšiť rýchlosť prehliadania webových stránok, tak zapnite v Apache modul mod_deflate (existuje aj modul mod_gzip, ten je ale starší a nahradil ho mod_deflate), ktorý môže znížiť množstvo prenesených dát až o 80%.

Článok bol zobrazený 5641 krát a obsahuje 2476 slov
Pridané 1. novembra 2020