5 moduri de a crește performanța PHP – Tideways

5 Modalități de creștere a performanței PHP

BONUS: am discutat acest subiect cu un expert în comunitatea PHP în podcastul nostru:

din proverbial, cutie, PHP oferă performanțe decente. Cu toate acestea, există mai multe lucruri pe care noi, ca Dezvoltatori PHP și administratori de sisteme, le putem face pentru a-i crește performanța și mai mult; uneori aproape fără efort.

în această postare, voi parcurge cinci dintre aceste căi. Până când ați terminat de citit, ar trebui să vedeți cel puțin o creștere notabilă a performanței aplicației PHP. Să începem.

utilizați PHP 7

una dintre cele mai bune modalități de a îmbunătăți performanța PHP este de a rula cea mai recentă versiune (PHP 7). Oferă o îmbunătățire semnificativă a vitezei față de orice versiune anterioară. Acum, rezultatele vor varia întotdeauna, deoarece nu există două aplicații la fel. Cu toate acestea, pe baza rapoartelor realizate de o serie de dezvoltatori diferiți și companii de găzduire notabile, îmbunătățirile de performanță sunt semnificative.

Iată un mic eșantion:

  • reperele oficiale PHP raportează că PHP 7 poate executa de două ori mai multe cereri pe secundă în comparație cu PHP 5.6.
  • indicatorii de performanță PHP ai Kinsta arată că WordPress 5.0 poate executa de 3 ori mai multe tranzacții decât PHP 5.6; și
  • Pantheon a raportat că PHP 7 a oferit o îmbunătățire de 64% față de versiunea 5.3.

dacă nu este suficient pentru dvs., verificați valorile de referință și vedeți ce spun acestea.

în plus, PHP 7.0.0 a fost lansat pe 3 decembrie 2015, iar cea mai recentă versiune stabilă, 7.3.6, a fost lansată pe 30 mai, anul acesta.

mai mult, versiunea finală a PHP 5, 5.6, a fost EOL (End of Life) acum 7 luni, pe 31 decembrie 2018. Deci, dacă nu ați făcut-o deja, este timpul trecut când ați făcut tranziția la PHP 7. Faceți upgrade-ul și, așa cum a spus Rasmus la phpCE 2018, mergeți verde(er) prin reducerea costurilor de găzduire.

Dezinstalați Xdebug

următorul lucru de verificat este că Xdebug nu este instalat pe serverele dvs. de producție. Sigur, Xdebug este unul dintre cei mai sofisticați și cuprinzători profileri și depanatori pentru PHP, dar nu ar trebui să fie niciodată activat (chiar instalat) pe un server de producție, cel puțin până când Xdebug 3 este lansat și ar trebui să vă alăturați în susținerea Derick pentru a lucra la el.

în timp ce valorile de referință de performanță variază (întotdeauna o fac), un raport privind depășirea stivei a arătat o creștere a performanței de 50% prin eliminarea completă a Xdebug. Mai mult, este important să rețineți că, deși Xdebug a fost instalat pe server — nici măcar nu a fost activat!

Xdebug performance benchmark Xdebug performance benchmark

pentru a verifica dacă este instalat, executați php -m | grep -i xdebug sau verificați panoul de administrare al furnizorului dvs. de găzduire. Și dacă doriți să aflați mai multe despre cum funcționează Xdebug, consultați documentația Xdebug.

Use Composer Optimize Autoloader

în timp ce suntem cu toții foarte familiarizați cu utilizarea Composer pentru a gestiona gestionarea pachetelor pentru noi, dacă nu luăm în considerare optimizarea configurației pe care o generează, aplicațiile noastre nu vor funcționa cât mai bine posibil.

Iată un citat din documentația compozitorului care explică de ce:

datorită modului în care sunt configurate regulile de autoloading PSR-4 și PSR-0, compozitorul trebuie să verifice sistemul de fișiere înainte de a rezolva în mod concludent un nume de clasă. Acest lucru încetinește lucrurile destul de mult, dar este convenabil în mediile de dezvoltare, deoarece atunci când adăugați o nouă clasă, aceasta poate fi imediat descoperită/utilizată fără a fi nevoie să reconstruiți configurația autoloader.

pentru a îmbunătăți performanța, Composer oferă trei niveluri de optimizare; acestea sunt:

  • generație de hărți de clasă
  • hărți de clasă autoritare
  • cache APCu

1: Class map generation

această strategie convertește Regulile PSR-4/PSR-0 în reguli classmap. Această strategie este mai rapidă, deoarece classmap poate returna instantaneu calea completă către fișierele cunoscute și evită o operație stat a sistemului de fișiere.

pentru a activa acest nivel de optimizare, executați următoarea comandă:

composer dump-autoload --optimize 

2/A: Hărți de clasă autoritare

în plus față de activarea automată a nivelului 1, atunci când se utilizează acest nivel, dacă o clasă nu se găsește în classmap generat, autoloader nu va încerca să se uite pe sistemul de fișiere în conformitate cu regulile PSR-4. Pentru a activa acest nivel de optimizare, executați următoarea comandă:

composer dump-autoload --classmap-authoritative 

2/B: apcu cache

acest nivel adaugă un cache APCu ca rezervă pentru harta clasei. Cu toate acestea, nu generează classmap. Având în vedere că, nivelul unu ar trebui să fie activat manual. Pentru a activa acest nivel de optimizare, executați următoarea comandă:

composer dump-autoload --apcu 

există compromisuri

în timp ce fiecare dintre aceste niveluri poate îmbunătăți performanța aplicației, Fiecare are compromisuri care trebuie înțelese înainte de a fi utilizate. Asigurați-vă că consultați documentația compozitorului înainte de a le utiliza.

utilizați un OPcache

deoarece PHP este un limbaj interpretat, nu compilat, runtime-ul PHP trebuie să convertească codul sursă în cod octet executabil, înainte de a putea fi executat. Și cum PHP este o arhitectură shared-nothing, acest proces trebuie să se întâmple la fiecare cerere.

cu toate acestea, cu un cache Opcode (OPcache), acest pas trebuie să se întâmple o singură dată pentru fiecare fișier, deoarece Opcodurile generate pot fi memorate în memoria partajată și menționate acolo.

deci, după cum vă puteți imagina, un OPcache este unul dintre cele mai puțin intensive moduri de a îmbunătăți performanța unei aplicații PHP, deoarece niciun cod nu trebuie să se schimbe. Unele rapoarte arată o îmbunătățire a vitezei de 70%.

au existat mai multe cache-uri Opcode pentru PHP de-a lungul anilor. OPCache (anterior Zend Cache) a fost inclus în PHP de la versiunea 5.5 — și este activat implicit în PHP 7.

pentru a afla mai multe despre aceasta, consultați documentația OPcache. Pentru a afla mai multe despre performanța tweaking OPcache, consultați articolul excelent al lui Hayden James, precum și postarea lui Tideway despre reglarea acestuia.

utilizați PHP 7 preîncărcare

dacă nu ați auzit de noua caracteristică de preîncărcare PHP 7.4, totuși, este foarte cool! Pe scurt, caracteristica duce funcționalitatea Opcache mai departe decât a dispărut vreodată.

pentru a recapitula rapid, prima dată când este întâlnit un fișier sursă PHP, acesta trebuie analizat, apoi compilat în bytecode dependent de mașină, înainte ca motorul Zend să îl poată executa. Opcaches reduc semnificativ cheltuielile generale ale acestui proces, deoarece după prima dată când codul sursă este analizat și compilat în jos, bytecodes sunt apoi stocate într-un cache Opcode în memoria partajată.

data viitoare când se întâlnește o cerere pentru acel fișier, PHP verifică dacă cache-ul Opcode are bytecodes pentru fișier. Dacă se întâmplă, sunt returnate și folosite. Dacă nu (sau dacă fișierul sursă s-a schimbat de la compilarea codurilor de octeți), fișierul sursă este analizat, compilat și memorat în cache. Acest lucru oferă un impuls de performanță notabil PHP.

acum, să ne uităm la modul în care funcționează preîncărcarea. Pentru a cita implementarea RFC:

la pornirea serverului-înainte ca orice cod de aplicație să fie rulat – putem încărca un anumit set de fișiere PHP în memorie – și să facem conținutul lor “disponibil permanent” pentru toate solicitările ulterioare care vor fi servite de acel server. Toate funcțiile și clasele definite în aceste fișiere vor fi disponibile pentru cereri din cutie, exact ca entitățile interne. Preîncărcarea asigură că:

  • toate funcțiile și majoritatea claselor, definite în aceste fișiere vor fi încărcate permanent în tabelele de funcții și clase PHP și vor deveni disponibile permanent în contextul oricărei solicitări viitoare.
  • PHP rezolvă dependențele de clasă și legăturile cu părintele, interfețele și trăsăturile (ceva ce nu se întâmplă cu cache-ul Opcode).
  • PHP elimină include inutile și efectuează alte optimizări.

având codul pentru o întreagă aplicație, inclusiv cadrul său (cum ar fi Zend expresiv, Symfony și Laravel) preîncărcat în memorie, cod care s-a schimbat doar la repornirea serverului, majoritatea aplicațiilor vor funcționa semnificativ mai bine.

acestea fiind spuse, preîncărcarea are câteva dezavantaje potențiale despre care ar trebui să știți:

  • o repornire a serverului este necesară atunci când fișierele sursă se schimbă.
  • preîncărcarea nu va funcționa în medii de Găzduire Partajată.
  • preîncărcarea nu va funcționa atunci când există mai multe versiuni ale aceleiași aplicații.

preîncărcarea nu este magică. Atât Codul, cât și procesele de implementare vor trebui refactorizate pentru a profita de acesta. De exemplu, cineva va trebui să dezvolte un script încărcător personalizat pentru a determina ce fișiere să se încarce la pornirea serverului și acel script va trebui să fie rulat la pornirea serverului. Indiferent, este o îmbunătățire semnificativă, una în care merită să investești!

folosiți un Profiler

acum pentru o opțiune care va necesita ceva mai multă muncă decât oricare dintre cele cinci anterioare. Adesea intrăm și încercăm să ghicim unde sunt blocajele de performanță din aplicațiile noastre, folosind intuiția și presupunerile educate.

deși acestea pot funcționa, nu sunt cele mai eficiente abordări. În schimb, putem folosi profilatori de cod pentru a analiza codul nostru și a arăta unde sunt blocajele. Mai exact, ele ajută la răspunsul la întrebări precum următoarele:

  • de câte ori a fost apelată fiecare metodă?
  • care a fost Timpul maxim de execuție al fiecărei metode?
  • care a fost timpul mediu de execuție al fiecărei metode?
  • de câte ori a fost inclus un fișier?
  • ce cale a parcurs o solicitare printr-o aplicație (de la primul la ultimul fișier de cod)?

de foraj în jos în rezultatele unui profiler, puteți fi de multe ori placut surprins, deși mai probabil șocat, pentru a găsi că cererea dumneavoastră este de executare căi de cod și clase care nu te-ai așteptat.

pe baza informațiilor din raportul profiler, dvs. și echipa dvs. puteți începe apoi să înțelegeți mai bine ce face aplicația dvs. și să faceți refactorizări în cunoștință de cauză pentru a o schimba, după cum este necesar.

dacă sunteți doar la început cu profilare, există mai multe opțiuni disponibile pentru PHP. Cele mai frecvent utilizate sunt:

  • Xdebug ‘ s profiler
  • extensia Xhprof a lui Tideway (& XHGui)
  • SPX Profiler
  • forp

în concluzie

și acestea sunt cinci moduri de a îmbunătăți calitatea aplicațiilor PHP în special. Oricare dintre ele pe cont propriu vă va oferi o îmbunătățire notabilă a performanței. Cu toate acestea, atunci când sunt utilizate împreună, ar trebui să vă așteptați să vedeți o performanță semnificativă, ca să nu mai vorbim de calitate, îmbunătățire.

Leave a Reply