Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • OS
  • Sfaturi pentru optimizarea scripturilor PHP. PHP Program Accelerator eAccelerator: Accelerați reîncărcarea codului PHP

Sfaturi pentru optimizarea scripturilor PHP. PHP Program Accelerator eAccelerator: Accelerați reîncărcarea codului PHP

Unul dintre criteriile principale pentru succesul oricărei resurse de internet este viteza de funcționare a acesteia, iar în fiecare an utilizatorii devin din ce în ce mai pretențioși în ceea ce privește acest criteriu. Optimizarea funcționării scripturilor PHP este una dintre metodele de asigurare a vitezei sistemului.

În acest articol, aș dori să prezint publicului colecția mea de sfaturi și fapte despre optimizarea scripturilor. Mi-a luat destul de mult timp să alcătuiesc colecția și se bazează pe mai multe surse și experimente personale.

De ce o colecție de sfaturi și fapte, mai degrabă decât reguli stricte? Pentru că, după cum am văzut, nu există o „optimizare absolut corectă”. Multe tehnici și reguli sunt contradictorii și este imposibil să le respecti pe toate. Trebuie să alegeți un set de metode care sunt acceptabile de utilizat fără a compromite siguranța și confortul. Am luat o poziție de recomandare și, prin urmare, am sfaturi și fapte pe care le puteți urma sau nu.

Pentru a evita confuzia, am împărțit toate sfaturile și faptele în 3 grupuri:

  • Optimizare la nivel de logica aplicatiei si organizare
  • Optimizarea codului
  • Optimizare inutilă

Grupurile sunt desemnate condiționat și unele articole pot fi atribuite mai multor dintre ele simultan. Numerele sunt pentru un server mediu (LAMP). Articolul nu discută probleme legate de eficacitatea diferitelor tehnologii și cadre terțe, deoarece acesta este un subiect pentru discuții separate.

Optimizare la nivel de logica aplicatiei si organizare

Multe dintre sfaturile și faptele legate de acest grup de optimizare sunt foarte semnificative și oferă un câștig de timp foarte mare.

  • Profilați-vă în mod constant codul pe server (xdebug) și client (firebug) pentru a identifica blocajele de cod
    Trebuie remarcat faptul că atât serverul, cât și părțile client trebuie să fie profilate, deoarece nu toate erorile de server pot fi detectate pe serverul însuși.
  • Numărul de funcții de utilizator utilizate în program nu afectează în niciun fel viteza
    Acest lucru permite programului să utilizeze nenumărate funcții personalizate.
  • Utilizați activ funcțiile personalizate
    Efectul pozitiv se realizează datorită faptului că operațiunile din interiorul funcțiilor sunt efectuate numai cu variabile locale. Efectul acestui lucru este mai mare decât costul apelurilor de funcții personalizate.
  • Este recomandabil să implementați funcții „grele critice” într-un limbaj de programare terță parte sub forma unei extensii PHP
    Acest lucru necesită abilități de programare într-un limbaj terță parte, ceea ce crește semnificativ timpul de dezvoltare, dar în același timp permite utilizarea tehnicilor dincolo de capacitățile PHP.
  • Procesarea unui fișier html static este mai rapidă decât un fișier php interpretat
    Diferența de timp pe client poate fi de aproximativ 1 secundă, așa că are sens să se separe în mod clar paginile statice de paginile generate de instrumentele PHP.
  • Dimensiunea fișierului procesat (conectat) afectează viteza
    Aproximativ 0,001 secunde sunt petrecute procesând la fiecare 2 KB. Acest fapt ne împinge să minimizăm codul de script atunci când îl transferăm pe serverul de producție.
  • Încercați să nu utilizați require_once sau include_once tot timpul
    Aceste funcții ar trebui folosite atunci când este posibil să citiți din nou fișierul, în alte cazuri, este recomandabil să utilizați require și include .
  • Când ramificați un algoritm, dacă există construcții care ar putea să nu fie procesate și volumul lor este de aproximativ 4 KB sau mai mult, atunci este mai optim să le includeți folosind include.
  • Este recomandabil să utilizați verificarea datelor trimise la client
    Acest lucru se datorează faptului că, la verificarea datelor din partea clientului, numărul de solicitări cu date incorecte este redus drastic. Sistemele de validare a datelor la nivelul clientului sunt construite în principal folosind JS și elemente de formular rigid (select).
  • Este recomandabil să construiți structuri DOM mari pentru matrice de date pe client
    Aceasta este o metodă de optimizare foarte eficientă atunci când lucrați cu cantități mari de date afișate. Esența sa se rezumă la următoarele: o serie de date este pregătită pe server și transferată către client, iar construcția structurilor DOM este furnizată funcțiilor JS. Ca rezultat, încărcarea este parțial redistribuită de la server la client.
  • Sistemele construite pe tehnologia AJAX sunt semnificativ mai rapide decât sistemele care nu folosesc această tehnologie
    Acest lucru este cauzat de o scădere a volumelor de ieșire și de redistribuirea sarcinii asupra clientului. În practică, viteza sistemelor cu AJAX este de 2-3 ori mai mare. Cometariu: AJAX, la rândul său, creează o serie de restricții privind utilizarea altor metode de optimizare, de exemplu, lucrul cu un buffer.
  • Când primiți o cerere de postare, returnați întotdeauna ceva, poate chiar un spațiu
    În caz contrar, clientului i se va trimite o pagină de eroare care cântărește câțiva kilobytes. Această eroare este foarte frecventă în sistemele care utilizează tehnologia AJAX.
  • Preluarea datelor dintr-un fișier este mai rapidă decât dintr-o bază de date
    Acest lucru se datorează în mare parte costului conectării la baza de date. Spre surprinderea mea, un procent uriaș de programatori stochează maniac toate datele din baza de date, chiar și atunci când utilizarea fișierelor este mai rapidă și mai convenabilă. Cometariu: Puteți stoca date în fișiere care nu sunt căutate, altfel ar trebui să utilizați o bază de date.
  • Nu vă conectați la baza de date decât dacă este necesar
    Dintr-un motiv necunoscut pentru mine, mulți programatori se conectează la baza de date în etapa de citire a setărilor, deși s-ar putea să nu facă interogări la baza de date mai târziu. Acesta este un obicei prost care costă în medie 0,002 secunde.
  • Utilizați o conexiune persistentă la baza de date atunci când există un număr mic de clienți activi simultan
    Beneficiul de timp se datorează lipsei costurilor pentru conectarea la baza de date. Diferența de timp este de aproximativ 0,002 secunde. Cometariu: Dacă există un număr mare de utilizatori, nu este recomandabil să folosiți conexiuni persistente. Când lucrați cu conexiuni persistente, trebuie să existe un mecanism de terminare a conexiunilor.
  • Utilizarea interogărilor complexe de baze de date este mai rapidă decât utilizarea mai multor interogări simple
    Diferența de timp depinde de mulți factori (volumul de date, setările bazei de date etc.) și se măsoară în miimi, și uneori chiar în sutimi de secundă.
  • Utilizarea calculelor din partea DBMS este mai rapidă decât calculele din partea PHP pentru datele stocate în baza de date
    Acest lucru se datorează faptului că astfel de calcule din partea PHP necesită două interogări la baza de date (primirea și modificarea datelor). Diferența de timp depinde de mulți factori (volumul de date, setările bazei de date etc.) și se măsoară în miimi și sutimi de secundă.
  • Dacă datele eșantionului din baza de date se modifică rar și mulți utilizatori accesează aceste date, atunci este logic să salvați datele eșantionului într-un fișier
    De exemplu, puteți utiliza următoarea abordare simplă: obținem date mostre din baza de date și le salvăm ca o matrice serializată într-un fișier, apoi orice utilizator folosește datele din fișier. În practică, această metodă de optimizare poate oferi o creștere multiplă a vitezei de execuție a scriptului. Cometariu: Când utilizați această metodă, trebuie să scrieți instrumente pentru a genera și modifica datele stocate în fișier.
  • Datele din memoria cache care se modifică rar cu memcached
    Câștigul de timp poate fi destul de semnificativ. Cometariu: Memorarea în cache este eficientă pentru datele statice, efectul este redus și poate fi negativ.
  • Lucrul fără obiecte (fără POO) este de aproximativ trei ori mai rapid decât lucrul cu obiecte
    De asemenea, se consumă mai multă memorie. Din păcate, interpretul PHP nu poate funcționa cu OOP la fel de repede ca cu funcțiile obișnuite.
  • Cu cât dimensiunea matricei este mai mare, cu atât funcționează mai lent
    Pierderea de timp apare din cauza manipulării structurilor imbricate.

Optimizarea codului

Aceste sfaturi și fapte dau o creștere nesemnificativă a vitezei în comparație cu grupul anterior, dar luate împreună aceste tehnici pot oferi un câștig bun de timp.

  • echo și print sunt semnificativ mai rapide decât printf
    Diferența de timp poate ajunge la câteva miimi de secundă. Acest lucru se datorează faptului că printf este folosit pentru a scoate date formatate, iar interpretul verifică întreaga linie pentru astfel de date. printf este folosit doar pentru a scoate date care necesită formatare.
  • echo $var."text" este mai rapid decât echo "$var text"
    Acest lucru se datorează faptului că motorul PHP în al doilea caz este forțat să caute variabile în interiorul șirului. Pentru cantități mari de date și versiuni mai vechi de PHP, diferențele de timp sunt vizibile.
  • echo „a” este mai rapid decât echo „a” pentru șiruri fără variabile
    Acest lucru se datorează faptului că în al doilea caz motorul PHP încearcă să găsească variabile. Pentru volume mari de date, diferențele de timp sunt destul de vizibile.
  • echo "a","b" este mai rapid decât echo "a"."b"
    Ieșirea datelor separate prin virgulă este mai rapidă decât printr-un punct. Acest lucru se datorează faptului că în al doilea caz are loc concatenarea șirurilor. Pentru volume mari de date, diferențele de timp sunt destul de vizibile. Notă: aceasta funcționează numai cu funcția echo, care poate lua mai multe linii drept argumente.
  • $return="a"; $return.="b"; echo $retur; mai rapid decât ecoul „a”; ecou „b”;
    Motivul este că ieșirea datelor necesită unele operații suplimentare. Pentru volume mari de date, diferențele de timp sunt destul de vizibile.
  • ob_start(); ecou „a”; ecou „b”; ob_end_flush(); mai rapid decât $return="a"; $return.="b"; echo $retur;
    Acest lucru se datorează faptului că toată munca se face fără a avea acces la variabile. Pentru volume mari de date, diferențele de timp sunt destul de vizibile. Cometariu: Această tehnică este ineficientă dacă lucrați cu AJAX, deoarece în acest caz este de dorit să returnați datele ca un singur șir.
  • Folosiți „inserție profesională” sau?> a b
    Datele statice (din afara codului) sunt procesate mai rapid decât ieșirea PHP. Această tehnică se numește inserție profesională. Pentru volume mari de date, diferențele de timp sunt destul de vizibile.
  • readfile este mai rapid decât file_get_contents , file_get_contents este mai rapid decât require și require este mai rapid decât include pentru a scoate conținut static dintr-un singur fișier
    Timpul necesar pentru a citi un fișier gol variază de la 0,001 pentru readfile la 0,002 pentru include .
  • require este mai rapid decât include pentru fișierele interpretate
    Cometariu: când ramificați un algoritm, când este posibil să nu folosiți un fișier interpretat, trebuie să utilizați include , deoarece require include întotdeauna fișierul.
  • dacă (...) (...) else if (...) () este mai rapid decât comutatorul
    Timpul depinde de numărul de ramuri.
  • dacă (...) (...) else if (...) () este mai rapid decât dacă (...) (...); dacă (...) ();
    Timpul depinde de numărul de ramuri și de condiții. Ar trebui să utilizați else dacă este posibil, deoarece este cel mai rapid construct „condițional”.
  • Condițiile cele mai comune ale construcției dacă (...) (...) else if (...) () ar trebui să fie plasate la începutul ramurii
    Interpretul scanează construcția de sus în jos până când găsește condiția îndeplinită. Dacă interpretul constată că condiția este îndeplinită, atunci nu se uită la restul construcției.
  • < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
    Acest lucru se datorează faptului că în al doilea caz operația sizeOf va fi executată la fiecare iterație. Diferența de timp de execuție depinde de numărul de elemente ale matricei.
  • x = sizeOf($array); pentru($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
    Diferența de timp este semnificativă și crește pe măsură ce matricea crește.
  • preg_replace este mai rapid decât ereg_replace, str_replace este mai rapid decât preg_replace, dar strtr este mai rapid decât str_replace
    Diferența de timp depinde de cantitatea de date și poate ajunge la câteva miimi de secundă.
  • Funcțiile șiruri sunt mai rapide decât expresiile regulate
    Această regulă este o consecință a celei anterioare.
  • Eliminați variabilele de matrice care nu mai sunt necesare pentru a elibera memorie.
  • Evitați utilizarea suprimării erorilor @
    Suprimarea erorilor produce o serie de operațiuni foarte lente și, deoarece rata de reîncercare poate fi foarte mare, pierderea vitezei poate fi semnificativă.
  • if (isset($str(5))) (...) este mai rapid decât if (strlen($str)>4)(...)
    Acest lucru se datorează faptului că operația standard de testare a isset este utilizată în locul funcției strlen pentru manipularea șirurilor.
  • 0,5 este mai rapid decât 1/2
    Motivul este că în al doilea caz se efectuează o operație de împărțire.
  • returnarea este mai rapidă decât globală atunci când returnează valoarea unei variabile dintr-o funcție
    Acest lucru se datorează faptului că în al doilea caz este creată o variabilă globală.
  • $row[„id”] este mai rapid decât $row
    Prima opțiune este de 7 ori mai rapidă.
  • $_SERVER['REQUEST_TIME'] este mai rapid decât time() pentru a determina când ar trebui să ruleze un script
  • dacă ($var===null) (...) este mai rapid decât dacă (is_null($var)) (...)
    Motivul este că în primul caz nu există nicio utilizare a funcției.
  • ++i este mai rapid decât i++, --i este mai rapid decât i--
    Acest lucru este cauzat de caracteristicile nucleului PHP. Diferența de timp este mai mică de 0,000001, dar dacă repetați aceste proceduri de mii de ori, atunci aruncați o privire mai atentă la această optimizare.
  • Creșterea variabilei inițializate i=0; ++i; mai rapid decât ++i neinițializat
    Diferența de timp este de aproximativ 0,000001 secunde, dar din cauza posibilei frecvențe de repetare, acest fapt trebuie reținut.
  • Utilizarea variabilelor retrase este mai rapidă decât declararea unora noi
    Sau permiteți-mi să o reformulez diferit: nu creați variabile inutile.
  • Lucrul cu variabilele locale este de aproximativ 2 ori mai rapid decât cu variabilele globale
    Deși diferența de timp este mai mică de 0,000001 secunde, din cauza ratei mari de repetare, ar trebui să încercați să lucrați cu variabile locale.
  • Accesarea directă a unei variabile este mai rapidă decât apelarea unei funcții în cadrul căreia această variabilă este definită de mai multe ori
    Apelarea unei funcții durează de trei ori mai mult timp decât apelarea unei variabile.

Optimizare inutilă

O serie de metode de optimizare în practică nu au un impact mare asupra vitezei de execuție a scriptului (câștigul de timp este mai mic de 0,000001 secunde). În ciuda acestui fapt, o astfel de optimizare este adesea subiect de controversă. Am prezentat aceste fapte „inutile”, astfel încât să nu le acordați o atenție deosebită atunci când scrieți cod în viitor.

  • ecoul este mai rapid decât imprimarea
  • include(„cale absolută”) este mai rapidă decât include(„cale relativă”)
  • sizeOf este mai rapid decât count
  • foreach ($arr ca $key => $valoare) (...) este mai rapid decât reset ($arr); în timp ce (listă($cheie, $valoare) = fiecare ($arr)) (...) pentru tablouri asociative
  • Codul necomentat este mai rapid decât codul comentat, deoarece este nevoie de timp suplimentar pentru a citi fișierul
    Este foarte stupid să reduceți volumul de comentarii de dragul optimizării, trebuie doar să efectuați minimizarea în scripturile de lucru („combat”).
  • Variabilele cu nume scurte sunt mai rapide decât variabilele cu nume lungi
    Acest lucru este cauzat de o reducere a cantității de cod procesat. Similar cu punctul anterior, trebuie doar să realizați minimizarea în scripturile de lucru („combat”).
  • Marcarea codului folosind tab-uri este mai rapidă decât utilizarea spațiilor
    Similar punctului anterior.

În sfârșit, aș dori să vă reamintesc încă o dată că sfaturile și faptele pe care le-am dat nu sunt absolute, iar semnificația aplicării lor depinde de situația specifică. Trebuie amintit că optimizarea scriptului este doar o mică parte a întregii proceduri de optimizare și este adesea posibil să trăiești în liniște fără sfaturile de mai sus.


Dacă aveți întrebări, vă recomandăm să utilizați

De la autor: Fiecare dezvoltator care se respectă își face griji cu privire la „soarta” codului său. Încearcă să facă aplicația cât mai convenabilă, mai rapidă și să-și mărească toleranța la erori pe cât posibil. Dar optimizarea PHP nu vă va permite întotdeauna să atingeți aceste înălțimi.

Nu vă vindeca brațul dacă piciorul este șchiopăt!

Scuze pentru aforismul popular irlandez! Dar reflectă perfect esența problemei. Cel mai adesea, optimizarea codului nu vă va permite să îmbunătățiți performanța scriptului sau a resursei create. Și în cazul lui , totul devine extrem de complicat datorită unui număr mare de factori pe care pur și simplu tu (ca dezvoltator) nu îi poți influența.

În ceea ce privește fenomenele dincolo de controlul nostru, mă refer la viteza conexiunii la Internet, încărcarea serverului, setările sistemului de operare pe computerul client și puterea hardware-ului computerului utilizatorului. Nu veți putea influența toate aceste componente. Și până la urmă se dovedește că optimizarea codului PHP nu va da un rezultat complet.

Ce rămâne sub controlul unui dezvoltator web:

Setările serverului sunt limitate. Setarea parametrilor prin fișierul de configurare Apache httpd.conf vă permite să setați numărul de procese secundare, expirarea conexiunii la socket, dimensiunea bufferului de ieșire pentru conexiunile TCP/IP, timpul de inactivitate și altele.

Setări de bază de limbă - prin parametrii specificați în fișierul php.ini. Vă permite să setați valori de buffering, să modificați timpul maxim de execuție a scriptului, gestionarea erorilor, gestionarea jurnalelor și alte setări.

Folosind optimizarea imaginii PHP - mai multe despre asta mai târziu. Optimizarea codului programului - vă permite să „economisiți” resurse și să creșteți performanța.

De exemplu, trebuie să știți că ecou este mai rapid decât imprimarea. Este mai bine să dezactivați mesajele de eroare după depanare pentru a economisi resurse. În loc de concatenarea șirurilor, utilizați echo. Obiectele și metodele de clasă () consumă multă memorie.

Lucrul cu imagini

Nu sunt un fan al procesării imaginilor pe server. Acest lucru duce, de asemenea, la o risipă de resurse prețioase, din care găzduirea este întotdeauna insuficientă. Se pare că economisind pe un lucru, irosim alte „rezerve”.

O opțiune mai optimă este încărcarea imaginilor într-un serviciu terță parte, de unde sunt încărcate într-o formă optimizată în browserul utilizatorului la o anumită adresă. Există multe astfel de servicii pe Internet. Vreau să numesc doar câteva dintre ele: kraken.io, TinyPNG

După cum puteți vedea, cunoștințele despre optimizarea motoarelor de căutare în PHP sunt, de asemenea, importante pentru dezvoltatorii profesioniști.

În plus, are propriile instrumente încorporate pentru „luminarea” imaginilor. De exemplu, funcția imagecopyresampled(). Reduce greutatea conținutului prin reeșantionarea și redimensionarea imaginii. Exemplu de utilizare:

header("Tip de conținut: imagine/jpeg");

$fisier = "sample.jpg" ;

$img_obrabot = imagecreatetruecolor(200, 100);

$img_orig = imagecreatefromjpeg($fișier);

imagecopyresampled($img_obrabot, $img_orig, 0, 0, 0, 0, 200, 100, 541, 286);

imagejpeg ($img_obrabot) ;

Ce altceva poti face?

De asemenea, nu uitați să aplicați optimizarea clientului folosind PHP. Într-o oarecare măsură, serverul poate influența browserul client prin Cache-Control, precum și atributele acestui antet: post-check, max-age și altele.

În plus, anteturile Last-Modified și ETag vă permit să gestionați starea cache-ului pe computerul client. Au stabilit un ID unic pentru a modifica fiecare fișier. Datorită acestui lucru, serverul nu retrimite resurse, ci doar răspunde cu starea 304.

În articol nu am ridicat problema optimizării folosind PHP FPM. Dar pentru a-l lua în considerare va necesita un articol separat. Asta e tot pentru azi. Pana data viitoare!

Ziua bună tuturor.

  1. Dacă o metodă poate fi statică, declarați-o statică.
  2. ecoul este mai rapid decât imprimarea.
  3. Transmiteți mai mulți parametri la ecou în loc să utilizați concatenarea șirurilor.
  4. Setați numărul maxim de ori în care buclele dvs. for pot trece înaintea buclei, nu în timp ce aceasta se execută.
  5. Ștergeți variabilele pentru a elibera memorie, mai ales dacă sunt matrice mari.
  6. Atenție la metodele magice precum __set, __get, __autoload.
  7. require_once are un cost.
  8. Specificați căile complete în constructele include/require, se va petrece mai puțin timp căutând fișierul.
  9. Dacă trebuie să determinați ora la care a fost rulat scriptul, utilizați $_SERVER['REQUEST_TIME'] în loc de time().
  10. Încercați să utilizați strncasecmp, strpbrk și stripos în loc de expresii regulate.
  11. str_replace este mai rapid decât preg_replace, dar strtr este mai rapid decât str_replace.
  12. Dacă funcția, ca și funcțiile de înlocuire a șirurilor, poate lua atât matrice, cât și caractere individuale drept argumente și dacă lista de argumente nu este prea lungă, luați în considerare să scrieți mai multe expresii de înlocuire identice, parcurgând câte un caracter, în loc de un cod șir care ia o matrice ca argument de căutare și înlocuire
  13. Este mai bine să selectați instrucțiuni folosind instrucțiuni else if, decât să utilizați mai multe instrucțiuni if.
  14. Suprimarea erorilor la utilizarea @ este foarte lentă.
  15. Utilizați modulul Apache mod_deflate.
  16. Închideți conexiunile la baza de date când ați terminat de lucrat cu ele.
  17. $row[„id”] este de șapte ori mai rapid decât $row.
  18. Mesajele de eroare sunt scumpe
  19. Nu utilizați funcții în interiorul unei condiții de buclă for, ca aceasta: for ($x=0; $x< count($array); $x). В данном случае функция count() будет вызываться с каждым проходом цикла.
  20. Creșterea unei variabile locale într-o metodă este cea mai rapidă. Creșterea unei variabile locale într-o funcție funcționează aproape în același mod.
  21. Creșterea unei variabile globale este de două ori mai lentă decât cea a uneia locale.
  22. Creșterea proprietății unui obiect (adică $this->prop++) este de trei ori mai lentă decât o variabilă locală.
  23. Creșterea unei variabile nedefinite este de 9-10 ori mai lentă decât cea a uneia pre-inițializate.
  24. Declararea unei variabile globale fără a o folosi într-o funcție încetinește, de asemenea, munca (aproximativ la fel ca și incrementarea unei variabile locale). PHP verifică probabil dacă variabila există.
  25. Viteza de invocare a metodei nu pare să depindă de numărul de metode definite în clasă. Am adăugat 10 metode la clasa de testare (înainte și după metoda de testare), fără nicio modificare a performanței.
  26. Metodele din clasele derivate funcționează mai rapid decât cele definite în clasa de bază.
  27. Apelarea unei funcții cu un parametru și un corp de funcție gol este în medie egală cu 7-8 incremente ale variabilei locale ($localvar++). Apelarea unei metode similare, desigur, durează aproximativ 15 trepte.
  28. Șirurile dvs. definite cu „ mai degrabă decât „ vor fi interpretate puțin mai repede deoarece PHP caută variabile în interiorul „..”, dar nu „...”. Desigur, puteți utiliza acest lucru numai atunci când nu există variabile în șirul dvs.
  29. Liniile delimitate prin virgulă sunt imprimate mai rapid decât liniile separate prin puncte. Notă: Aceasta funcționează numai cu funcția echo, care poate lua mai multe linii drept argumente.
  30. Scripturile PHP vor fi procesate de cel puțin 2-10 ori mai lent decât paginile HTML statice. Încercați să utilizați mai multe pagini HTML statice și mai puține scripturi.
  31. Scripturile dvs. PHP sunt recompilate de fiecare dată dacă scripturile nu sunt stocate în cache. Memorarea în cache a scripturilor îmbunătățește de obicei performanța cu 25-100% prin eliminarea timpului de compilare.
  32. Cache cât mai mult posibil. Utilizați memcached, un sistem de înaltă performanță de stocare a obiectelor în memorie, care îmbunătățește viteza aplicațiilor web dinamice, facilitând încărcarea bazei de date. Microcodul stocat în cache este util, deoarece împiedică compilarea scriptului pentru fiecare solicitare.
  33. Când lucrați cu șiruri, când trebuie să vă asigurați că un șir are o anumită lungime, veți dori desigur să utilizați funcția strlen(). Această funcție este foarte rapidă deoarece nu efectuează niciun calcul, ci returnează doar lungimea deja cunoscută a șirului, disponibilă în structura zval (o structură C internă folosită atunci când se lucrează cu variabile în PHP). Cu toate acestea, deoarece strlen() este o funcție, aceasta va fi lentă din cauza faptului că va apela unele operațiuni, cum ar fi conversia șirurilor de caractere mici și căutările în tabelul hash, înainte ca acțiunile principale ale funcției să fie efectuate. În unele cazuri, puteți accelera codul folosind trucul isset().
    Era: if (strlen($foo)< 5) { echo «Foo is too short»; }
    Acum: if (!isset($foo(5))) ( ecou „Foo este prea scurt”; )
    Apelarea isset() este mai rapidă decât strlen() deoarece, spre deosebire de strlen(), isset() nu este o funcție, ci un construct de limbaj. Datorită acestui fapt, isset() nu are practic nicio suprasarcină pentru determinarea lungimii șirului.
  34. Creșterea sau decrementarea unei variabile folosind $i++ este puțin mai lentă decât ++$i. Aceasta este o caracteristică specială a PHP și nu ar trebui să vă modificați codul C și Java în acest fel, crezând că va rula mai repede, nu. ++$i va fi mai rapid în PHP, deoarece în loc de patru comenzi ca la $i++, aveți nevoie doar de trei. Post-incrementarea este utilizată de obicei atunci când se creează variabile temporare care sunt apoi incrementate. În timp ce pre-incrementul crește valoarea variabilei originale. Aceasta este una dintre modalitățile de optimizare a codului PHP în bytecode folosind utilitarul Zend Optimizer. Cu toate acestea, aceasta este o idee bună, deoarece nu toți optimizatorii de bytecode optimizează pentru acest lucru și există încă multe scripturi care funcționează fără optimizarea bytecode.
  35. Nu totul trebuie să fie OOP, acest lucru este adesea inutil, deoarece fiecare metodă și obiect ocupă multă memorie.
  36. Nu definiți fiecare structură de date ca o clasă, matricele pot fi foarte utile
  37. Nu defalca prea mult metodele. Gândește-te la ce vei reutiliza de fapt.
  38. Puteți împărți codul în metode mai târziu, după cum este necesar.
  39. Utilizați nenumărate funcții predefinite.
  40. Dacă codul dvs. are funcții care durează foarte mult timp pentru a fi executate, luați în considerare să le scrieți în C ca extensie
  41. Profilați codul dvs. Profilarea vă va arăta cât durează executarea părților codului.
  42. mod_gzip este un modul Apache care vă permite să vă comprimați datele din mers și poate reduce cantitatea de date transferată cu până la 80%.

În acest articol vreau să dau câteva sfaturi, în urma cărora puteți accelera semnificativ procesarea scripturilor PHP, eliberând astfel serverul hosterului de munca inutilă în favoarea unor...

Folosiți ghilimele simple în loc de ghilimele duble

Faptul este că textul cuprins între ghilimele duble este scanat de procesor pentru prezența variabilelor, precum și substituții mnemonice (de exemplu, \n pentru a insera un caracter newline în text).

print("Acesta este un text complet normal, dar procesorul PHP îl scanează pentru variabile și substituții mnemonice înainte de a-l scoate. Dacă o astfel de linie este suficient de lungă, acest proces durează mult timp.");

Dacă textul este cuprins între ghilimele simple, atunci interpretul PHP îl afișează cu ascultare în forma sa originală, fără să se gândească măcar să caute ceva în el. Acest lucru durează mult mai puțin decât în ​​exemplul anterior.

print("Procesorul PHP va fi foarte fericit când vede un șir cuprins între ghilimele simple. Și cum să nu fii fericit - nu este nevoie să faci o muncă inutilă!");

Desigur, șirurile de acest tip pot fi folosite nu numai în funcții, ci și în variabile.

$string="Ce binecuvântare este să nu mai analizezi această linie!";

Nu pune variabile între ghilimele

De foarte multe ori vezi o imagine similară.

print("Procesorul PHP a durat $timp secunde pentru a procesa această pagină.");

După ce am învățat sfatul meu anterior și știind că este mult mai ușor pentru interpretul PHP să „lipească” șirurile împreună decât să le scaneze pentru variabile și să le înlocuiască cu șirurile corespunzătoare acelor variabile, nu este greu de ghicit că exemplul meu anterior este un exemplu de utilizare ineficientă a resurselor serverului. Acum să mulțumim serverul cu un script optimizat.

print(„Procesorul PHP, bucurându-se de viață, a procesat acest script în „.$timp.” secunde.”);

Pentru cei din rezervor: liniile sunt unite folosind un punct (.), adică

print("Adresa acestui site este http://".$_SERVER["HTTP_HOST"]."/!");

va afișa textul „Adresa acestui site este http://argon.com.ru/!”

Utilizați un minim de variabile

Trebuie să vă amintiți întotdeauna că orice variabilă globală este stocată în memorie pe întreaga durată a scriptului! Ca exemplu de batjocură de server, voi da următorul cod.

Întrebarea este, de ce dracu ar trebui să ocupăm memorie suplimentară, irosind încărcătura serverului?... Este mult mai eficient să o facem așa.

print("Procesorul PHP se bucură să scoată linii ca aceasta.");

Deci, dacă un șir este folosit de mai puțin de două ori, atribuirea unei variabile a valorii acelui șir este dăunătoare.

Utilizați nume scurte de variabile

Dacă scriptul folosește variabile cu nume nerezonabil de lungi, sarcina pe server crește în mod natural.

$windows_xp_edition="Profesional";
$windows_xp_build="2600";
$windows_server2003_edition="Standard";
$windows_server2003_build="3200";

Dar nici nu ar trebui să dați nume prea laconice - în viitor, atunci când editați un scenariu de dimensiuni impresionante, vă veți aminti de mama creatorului său de o sută de ori, și nu cu un cuvânt afectuos :)

$ifa="Profesional";
$ifb="2600";
$ifc="Standard";
Sifd="3200";

Cea mai bună opțiune este să dai nume laconice, dar ușor de înțeles, care să nu depășească opt caractere.

$wxped="Profesional";
$wxpbld="2600";
$ws2k3ed="Standard";
Sws2k3bld="3200";

Utilizați funcții imbricate

Vezi așa ceva foarte des.

$șir=str_înlocuire("\n"," ",$șir);
$șir=str_înlocuire("\r"," ",$șir);
$șir=trim($șir);
$șir=stripslashes($șir);
$șir=chop($șir);
$șir=substr($șir,0,1024);
print($șir);

$șir))))),0.1024));

Sunt de acord, pare terifiant, dar se vede o creștere notabilă a productivității! Este foarte ușor să faci așa ceva dacă începi de la sfârșit, înlocuind de fiecare dată valoarea corespunzătoare pentru variabila...

Utilizați funcții încorporate

Permiteți-mi să vă dau un exemplu simplu de script care înlocuiește toate caracterele HTML speciale cu substituțiile mnemonice corespunzătoare.



$string=str_inlocuire("<","<",$string);
$șir=str_înlocuire(">"",">",$șir);
print($șir);

Același lucru se poate realiza dacă utilizați acest cod.

print(htmlspecialchars($string));

Arată mai frumos, cântărește mai puțin și reduce semnificativ sarcina pe server, mai ales atunci când procesează șiruri lungi.

Încă un exemplu. Folosind acest script, puteți citi conținutul unui fișier text într-o matrice.

$fp=fopen("database.txt","r");
while($array=fgets($fp,1024));
fclose($fp);

Dar PHP are o funcție încorporată de fișier() teribil de utilă, care face exact același lucru, dar mult mai rapid!

fisier("database.txt");

Concluzie: nu fi leneș să mai arunci o privire la cartea de referință pentru funcțiile PHP. Sunt sigur că veți găsi acolo multe instrumente pentru a vă face viața mai ușoară (și a serverului).

Utilizați propriile funcții

Adesea este necesar să procesați mai multe linii folosind exact același algoritm. Asta fac programatorii neexperimentati...

print(substr(chop(stripslashes(trim(str_replace("\r","",,str_replace("\n","", $șir1))))),0,1024));
print(substr(chop(stripslashes(trim(str_replace("\r","",,str_replace("\n","", $șir2))))),0,1024));

Iar cei experimentați vor lua un traseu mai simplu.

formatul funcției(&$șir)(

}
print(format($string1));
print(format($string2));

Astfel puteți efectua aceeași acțiune de mai multe ori, încărcând minim serverul.

Nu creați funcții inutile

De exemplu, dacă un programator destul de experimentat uită sau nici măcar nu știe despre existența unei funcții încorporate de care are nevoie, poate scrie cu ușurință una singur.

funcția de optimizare(&$șir)(
$string=str_replace("&","&",$string);
$șir=str_înlocuire(""",""",$șir);
$string=str_inlocuire("<;","<",$string);
$șir=str_înlocuire(">"",">",$șir);
}
print(optimize($string));

Dar te poți descurca cu mijloace mai simple.

print(htmlspecialchars($string);

Nu utilizați funcții inutile

Iată un exemplu de cod ineficient.

print("Unchiul meu");
print("i-au jefuit pe cei mai sinceri...");

Dar poate fi optimizat foarte ușor.

print("Unchiul meu "."cele mai oneste reguli...");

Simți diferența? Crede-mă, hosterul în acest caz îți va fi recunoscător doar pentru resursele serverului eliberate...

Folosiți funcțiile cu înțelepciune

De exemplu, acest script.

print(ereg_replace("normal","nefericit",$string));

Activează algoritmul de procesare a expresiilor regulate (POSIX) acolo unde nu este deloc necesar. Și serverul este încărcat mult mai mult. Dar îi poți ușura soarta înlocuind funcția de lacom cu una mai puțin lacomă de resurse.

print(str_inlocuire("nefericit","fericit",$string));

Nu smuci prea mult de manipulator

Se știe că tot ceea ce este conținut în afara unei etichete de cod PHP nu este procesat de procesorul PHP, ci pur și simplu transmis neschimbat. Unii oameni îl folosesc așa.

... antetul paginii...
print($titlu);
?>
…navigare…

?>
...subsolul paginii...

Dar intrarea și ieșirea din modul de procesare PHP încarcă serverul mai mult decât dacă ar fi folosit.

print("...antetul paginii...".$titlu."...navigation...");
include ("conținut dinamic");
print("...subsolul paginii...");
?>

Va urma

Până acum, am acoperit doar o mică parte din aisbergul de optimizare PHP. Este posibil ca respectarea unui singur sfat să nu dea o creștere vizibilă a productivității, dar respectarea împreună a tuturor acestor reguli de bază ale politeței programatorului va reduce semnificativ sarcina de pe server și vă va crește autoritatea.

Dacă aveți întrebări sau sugestii, vă rugăm să contactați.

Mult succes cu optimizarea ta!

La dezvoltarea proiectelor mari se pune treptat problema optimizării codului proiectului: cât de justificat este consumul de memorie, cum poți crește viteza de execuție a codului PHP scris. La început, mulți oameni nu se gândesc la corectitudinea și eficiența codului scris pe care îl scriu conform principiului: funcționează - și este în regulă. Deși interpretul PHP este destul de rapid la executarea codului PHP și există multe blocaje care încetinesc execuția codului care se află în afara PHP, optimizarea codului PHP este, de asemenea, importantă, iar optimizarea codului ar trebui aplicată la începutul procesului de codare.

Majoritatea scripturilor PHP fac lucruri simple. Comportamentul standard al scriptului este de a descărca o cantitate mică de informații de la utilizator, de a prelua unele informații dintr-o bază de date sau de un fișier, de a scoate codul HTML corespunzător și de a trimite rezultatul către client. Aici, primul lucru pe care trebuie să îl înțelegeți este care ar trebui să fie exact rezultatul optimizării: performanță, ușurință de scalare, reducerea cantității de resurse server utilizate, reducerea timpului de transfer de date sau toate împreună. În acest din urmă caz, este necesar nu numai să găsim toate zonele critice, ci și să echilibrăm optimizarea acestora.

Permiteți-mi să vă dau un exemplu simplu: să existe două scripturi pe un server cu 100 MB de RAM liberă, al căror rezultat este același. Primul script este optimizat pentru performanțe maxime, necesită 10 MB de memorie și primește date dintr-un fișier citindu-l complet, al doilea este optimizat pentru un consum minim de memorie, necesită 5 MB de memorie și primește date din același fișier pe părți. Ca urmare a unei cereri, primul script va fi executat mai repede decât al doilea, dar dacă există mai mult de zece solicitări în același timp, viteza celui de-al doilea script va deveni mai mare. De ce se întâmplă asta? În primul script, blocajul este utilizarea resurselor de memorie, în al doilea - caracteristicile sistemului I/O. După ce primul script consumă toată memoria RAM disponibilă, sistemul va trece la utilizarea memoriei virtuale, iar același sistem I/O va deveni un blocaj suplimentar al acestei scheme.

Desigur, acest exemplu este mult simplificat și există și alte blocaje în afară de RAM, dar ideea principală este aceasta: optimizarea pentru un caz poate deveni un punct critic în altul. În exemplu, ca urmare a optimizării pentru o ușoară creștere a vitezei la încărcări mici, viteza de execuție a scriptului la încărcări mai mari a scăzut semnificativ. Prin urmare, pentru a obține profituri mai bune, este important să vă cheltuiți energia optimizând zonele care merită cu adevărat atenție.

Nu voi lua în considerare aici optimizarea sistemului de operare, optimizarea setărilor serverului etc., deoarece... Majoritatea webmasterilor folosesc găzduirea și, în consecință, nu vor putea configura totul pe cont propriu. Numai optimizarea codului PHP va fi luată în considerare aici. Trebuie remarcat faptul că, în fiecare caz specific, unele tipuri de optimizare vor fi utile, altele vor fi o pierdere de timp și efort. Adesea, beneficiul îmbunătățirii codului va fi neglijabil. Poate că, de-a lungul timpului, modificările interne în PHP vor face optimizarea de succes inutilă sau chiar dăunătoare.

Mai jos sunt pașii principali de performanță pentru versiunea PHP 5:

Acțiuni pentru optimizarea consumului de memorie RAM:

  1. Analizați rezultatele funcțiilor dvs. Înainte de a scrie o funcție, verificați dacă există un echivalent standard.
  2. Eliberarea memoriei când matricele mari sau obiectele sunt terminate fiind utilizate numai în domeniul global (memoria va fi eliberată automat în domeniul local). Vă rugăm să rețineți că funcția unset() elimină o variabilă din domeniu și, numai dacă nu există alte referințe la obiect, eliberează memoria ocupată de obiect. Atribuirea unei valori unei variabile nul distruge întotdeauna obiectul și eliberează memoria ocupată de obiect, indiferent dacă mai există referințe la acest obiect. În acest caz, variabila nu va fi eliminată din domeniul de aplicare, adică. de fapt, variabila va conține o valoare nedefinită (zero) și, în consecință, va ocupa memorie pentru conținutul acestei variabile (aproximativ 72 de octeți).
  3. Analiza justificării utilizării OOP (programare orientată pe obiecte). Înainte de a scrie cod orientat pe obiecte, puneți-vă două întrebări: „Este nevoie de o abordare orientată pe obiecte?” și „pot scrie cod orientat pe obiecte?” De exemplu, definirea unei funcții statice în interiorul unei clase crește cantitatea de memorie necesară doar pentru a conține acea funcție cu 10-18%. Utilizarea unui tablou mai degrabă decât a unei clase ca structură economisește și memorie. Ar putea fi mai profitabil să puneți pur și simplu funcțiile într-un fișier separat, decât să le implementați ca metode de clasă.
  4. Analiza posibilității de implementare a unei versiuni statice a unei metode într-o clasă. Dacă metoda nu utilizează un parametru $aceasta, atunci trebuie declarat folosind cuvântul cheie static.

Acțiuni pentru creșterea vitezei de execuție a codului:

  1. Analiza optimizării interogărilor SQL. În majoritatea proiectelor, optimizarea interogărilor SQL este cea care oferă cea mai mare creștere a performanței.
  2. Utilizarea tamponării de ieșire și a diferitelor module de cache poate crește performanța cu 25% -100%.
  3. Utilizarea unor nume scurte mai scurte pentru variabile, funcții, constante și clase poate îmbunătăți performanța cu până la 20%. În același timp, nu uitați de suportul suplimentar pentru cod, un nume clar al funcției este mult mai convenabil atunci când modificați codul.
  4. Verificarea existenței unei variabile (funcția isset()) înainte de a o contacta. Suprimarea erorii care apare la accesarea unei variabile inexistente prin utilizarea @ este un succes uriaș de performanță.
  5. Folosirea „ghilimele simple” vă permite să interpretați codul mai rapid, deoarece în cazul „ghilimelor duble”, variabilele sunt căutate în interiorul șirului
  6. Analiza posibilității de a elimina funcțiile „extra” din buclă. De exemplu, înlocuirea unei funcții numara() la o variabilă calculată înainte de începerea buclei și care conține rezultatul acestei funcție, în expresie pentru($i=0; $i va îmbunătăți performanța acestui ciclu. Altfel functia numara() va fi apelat și executat la fiecare iterație a buclei.
  7. Utilizarea operatorului cazîn loc de a folosi mai multe constructe daca...altfel.
  8. Utilizarea accesului explicit la câmpurile matrice. Inversarea formularului $array[„id”] rulează de 7 ori mai repede decât inversarea $array. În plus, acest lucru protejează împotriva erorilor în timpul suportului suplimentar al scriptului, deoarece într-o zi ar putea exista o constantă numită id.
  9. Utilizarea unei variabile adiționale care conține o referință la matricea finală atunci când procesează matrice multidimensionale într-o buclă. Pentru a accelera ciclul pentru($i = 0; $i< 5; $i++) $a["b"]["c"][$i] = func($i); , înainte de începerea buclei este posibil să scrieți următoarea instrucțiune $item =p$a["b"]["c"]și rescrieți bucla astfel: pentru($i = 0; $i< 5; $i++) $ref[$i] = $i; .
  10. Utilizarea modulelor Apache mod_gzip și mod_deflate vă permite să reduceți traficul, crescând astfel viteza de încărcare a paginii.

Următorii pași de optimizare a codului îmbunătățesc performanța numai atunci când sunt utilizați în mod repetat:

  1. Utilizare +$iîn loc de $i++în cicluri dă o creștere a performanței de 6%.
  2. Folosind „ghilimele duble” pentru a concatena variabile. Instruirea formularului $s="$s1$s2$s3" interpretat mai repede decât $s=$s1.$s2.$s3. Această afirmație este valabilă numai pentru trei sau mai multe variabile.
  3. Utilizarea căilor complete în instrucțiuni includeȘi cere vă va permite să petreceți mai puțin timp căutând sistemul pentru a găsi calea reală.
  4. Închiderea conexiunilor deschise la baza de date după ce acestea nu mai sunt necesare. În același timp, nu ar trebui să vă conectați la aceeași bază de date de mai multe ori.
  5. Analiza de fezabilitate a înlocuirii include()Și include_once() pe cere()Și require_once() respectiv.
  6. Folosind inserări HTML în cod, în loc să scoată o cantitate semnificativă de linii statice (care nu conțin rezultatele codului). În general, viteza de emitere a unei pagini statice (HTML) este de câteva ori mai rapidă decât emiterea unei pagini scrise în PHP. Dar nu ar trebui să te lași dus aici, pentru că... Intrarea și ieșirea din interpret în modul de procesare PHP încarcă și serverul.
  7. Analiza posibilitatii de inlocuire a functiilor preg_replaceȘi str_replace in unele cazuri. Funcţie str_replace funcționează mai repede decât preg_replace, și în același timp și funcția strtr funcții mai rapide str_replace. De asemenea, folosind funcții șir strncasecmp, strpbrkȘi stripos mai optim decât utilizarea expresiilor regulate. Cu toate acestea, în loc să imbricați aceste funcții, ar trebui să utilizați funcții de expresie regulată.
  8. Utilizarea inițializării variabile explicite. De exemplu, creșterea unei variabile neinițializate este de 9-10 ori mai lentă decât a unei variabile inițializate anterior. În plus, există mai puține erori la inițializarea explicit a variabilelor.
  9. Ca o concluzie, aș dori să remarc faptul că utilizarea designului ecou, în loc de o funcție imprimare, nu asigură o creștere vizibilă a productivității.
  • Pentru a determina ora de începere a execuției scriptului, în locul funcțiilor care returnează ora curentă, este de preferat să folosiți $_SERVER[„REQUEST_TIME”].
  • Utilizați un profiler pentru a identifica secțiunile critice ale codului.

Înainte de a optimiza performanța codului, vă recomand cu tărie să verificați optimizarea interogărilor SQL în baza de date, precum și optimizarea interogărilor http, reducerea dimensiunii js și css, gândirea la șabloane de cache și abia după aceea începeți testarea performanței codului.

Un stil de programare bun implică optimizarea în timpul scrierii codului, mai degrabă decât corectarea găurilor mai târziu.

Cele mai bune articole pe această temă