Tips for å optimalisere PHP-skript. Fremskynde PHP-programmer Optimalisering av klientsiden i php

Ytelsen til PHP-løsninger er et hyppig tema for kontroverser og diskusjoner. Vi vil ikke delta i dem nå. Tross alt, uansett hvor det måtte være, avhenger alt alltid av den spesifikke oppgaven. For eksempel kjenner jeg til et pålitelig tilfelle da en bestemt programkode ble skrevet om i Assembler i halvannet år. Det ble opprinnelig skrevet i C. Da arbeidet var fullført, ble hundrevis av arbeidsdager av en stor gruppe utviklere lagt igjen, og en versjon av programvaren, ferdig skrevet i Assembler, var i hånden. For en overraskelse teamet var da, som et resultat, deres skapelse i Assembler begynte å fungere mye tregere enn deres tidligere skapelse i C!

Optimalisering av programkode er en mangefasettert oppgave. Det er mange faktorer å vurdere. Det skal forstås at det i noen tilfeller kan neglisjeres helt: tross alt er det ofte lettere å kjøpe høyytelses maskinvare enn å betale for tilleggsarbeidet til et team med utviklere av høy kvalitet. Automatisering, industrialisering, mine venner! Roboter erstatter mennesker. Men en gang var det slike yrker som for eksempel yrket som lampetenner eller heisfører, nei, ikke den som nå reparerer og vedlikeholder heiser. Han som pleide å være heisnavigatør og tok passasjerer dit de spurte. Nå virker det allerede latterlig. Og om et visst antall år vil flypiloter skape latter. De vil fly på helautomatiske kontrollsystemer, etc.

På en eller annen måte er det ingen vits i å optimalisere svært enkle eller sjelden brukte programvarebiter. I hvert fall til det øyeblikket alt annet er i orden. Hva egentlig bør du være oppmerksom på først og fremst? Nå skal vi snakke om dette.

La oss ta en titt på PHP som et eksempel. Faktisk, uansett hva de sier om det, PHP er ikke verre enn Perl eller ASP.NET, jeg vil si tvert imot - PHP har mye flere fordeler. Hvorfor får han det mest av alt? Veldig enkelt - fordi det er det mest populære! Tross alt skjeller alle Windows, den har flest virus, den har flest "hull" som finnes i seg. Men dens popularitet er verdt ... Hmm, mer enn 98% av brukerne jobber under Windows OS. Alle andre operativsystemer til sammen utgjør ikke mer enn 2 % av brukerne. Ikke overraskende har Windows fått så mye oppmerksomhet. Jeg er sikker på at hvis andre operativsystemer var like populære (og like komplekse, funksjonelle og rimelige), ville det ikke vært færre hull i det. Vel, ok, dette er en samtale for et eget emne.

Tilbake til PHP, blant annet, er det kanskje det enkleste programmeringsspråket som er mye brukt på nettet. Dens enkelhet og tilgjengelighet bestemmer den nye hæren av nykommere som prøver å gjøre i det minste noe i den. Deres inkompetanse fører ofte til negative diskusjoner om PHP. Den samme ASP.NET er ikke så tilgjengelig. Som et resultat er dens viktigste "bærere" ganske kunnskapsrike mennesker. Med alle de påfølgende konsekvenser. Men tilgjengeligheten av PHP negerer på ingen måte dens fordeler i hendene på fagfolk.

Tross alt, hva er det mest populære sosiale nettverket og den nest mest besøkte nettressursen i verden, facebook, skrevet på? Og dens analoge vkontakte? PHP, selvfølgelig!

Bruksomfanget bør forstås. Hvis du trenger å utføre seriøse beregninger, spesielt de som er relatert til multimedia, med store data og høye belastninger, for eksempel online videobehandling, er det selvfølgelig bedre å skrive den tilsvarende koden i samme C og allerede bruke den under PHP som en kompilert modul. PHP er mer en universell malmotor enn et programmeringsspråk slik vi forstår det. PHP har helt andre oppgaver.

I denne forbindelse, for å optimalisere ytelsen til PHP-kode, er tilnærmingene forskjellige: det er viktigere å optimalisere selve algoritmen, modellen for å løse problemet, enn spesifikt koden. Det finnes imidlertid unntak.

7 prinsipper, eller 7 posisjoner for PHP-kodeoptimalisering.

1) Kjærlighet til ferdige bibliotek.

Ulike ferdige biblioteker er absolutt nyttige og praktiske ting. Men du bør ikke glemme at gratisost kun er i en musefelle. For alt, på en eller annen måte, må du betale.

Utviklingen av programvare for implementering av ideen om et bestemt nettsted vil alltid (underlagt sammenlignbare nivåer av utøvere, selvfølgelig) når det gjelder ytelse vil være mye mer lønnsomt enn å bruke et ferdiglaget, universelt CMS (Content Management) System - innholdsstyringssystem, nettsted "motor"). Dårlig ytelse er en tilbakebetaling for allsidigheten til CMS. Dette er det samme som å gå til basaren med privat buss, eller til og med med fly, men ikke med egen bil. Det er det samme med ferdige biblioteker.

Men hvorfor satte jeg bibliotekene først? For hvis de brukes, tærer de umiddelbart på brorparten av produktiviteten. Se selv: koble til alene Smart og DbSimple umiddelbart "spiser" ca 0,025 sek. tid og nesten 3/4 MB RAM. Og dette er på en anstendig server med lav totalbelastning. Legg til noe annet her phpMailer og vi har 0,03 sek. brukt tid og 1 MB slukt minne rett og slett fra bunnen av. Vi har ikke gjort noe ennå, bare koblet til modulene, dette er til og med uten initialisering! Jeg har ett selvskrevet prosjekt, som et sosialt nettverk, så i gjennomsnitt krever det merkbart færre ressurser å lage en side fullstendig. Et annet eksempel er en nyhetssidemotor som jeg utviklet: innlegg, kommentarer osv. I det store og hele ikke noe superkomplisert, men hastigheten er også grei - i snitt under 0,001 sek. for sidegenerering og opptil 0,15 MB minne. Prosjektene er bygget på PHP + MySQL-bunt. Forresten, dermed den andre av dem, har rolig mer enn 400 tusen. treff per dag, med utbrudd på opptil 1600 treff per minutt i topper og nesten 500 verter online. På en VPS for $ 30 / mnd. Og koble de tre bibliotekene til den, så kan du ikke klare deg uten en dedikert server, og ikke den svakeste konfigurasjonen. Men det kommer ofte til bruk av et titalls ferdige biblioteker.

På den annen side, hvis du skal utvikle en liten nettside for en bedrift, eller en personlig side, er det selvsagt ingen vits å ta seg av optimalisering, og dermed er det ingen vits i å nekte å bruke ferdige bibliotek. Tid er mer dyrebar. Hvis trafikken til nettstedet ditt ikke er mer enn 1000 besøkende per dag, bør du ikke kaste bort tid på en perfekt og rask kode. Bruk ferdige biblioteker. Ressursene til enhver god delt hosting vil være nok for deg. Hvis trafikken din når 2-3 tusen besøkende per dag, er det allerede fornuftig å tenke på kodeoptimalisering. Men likevel bør du tenke nøye gjennom om du på dette stadiet bør forlate ferdige biblioteker og drepe tid for å omarbeide koden (eller tid og penger for en programmerer som vil gjøre det). Det er ofte lettere å bare kjøpe ekstra ressurser, eller bytte til en VPS, og betale $ 10-50 per måned.

På den annen side bør du ta hensyn til kompleksiteten i overgangen til løsninger uten bruk av ferdige biblioteker. Jeg skrev den samme motoren for en nyhetsside på nesten én dag. Tross alt krever blant annet "tunge" skript ikke bare kraftigere hosting, men bremser også åpningen av nettstedssider i nettleseren, spesielt hvis siden dannes i løpet av få sekunder. Hvis det ikke er veldig dyrt for deg å nekte å bruke ferdige biblioteker, vil jeg anbefale deg å gjøre det uansett.

Oppsummert, jeg understreker nok en gang - du kan trygt bruke biblioteker, øke kapasiteten til servere, men du bør ikke glemme at dette er den første grunnen til det trege arbeidet med skriptene dine, og i tillegg til den høye belastningen på maskinvaren, de forårsaker mange forsinkelser i lasting av nettstedssider.

2) Ignorerer Zend Optimizer, eAccelerator

Disse flotte modulene er hovedsakelig opptatt av optimalisering og dynamisk caching av kompilert PHP-kode ( byte - kode). Ofte lar de deg øke produktiviteten med nesten titalls ganger. Bruken deres er fornuftig, for det første, på ganske store og høyt besøkte prosjekter, selv om du kan optimalisere andre nettsteder i PHP - dette vil ikke kreve noen ekstra manipulasjoner fra deg. Vi vil snakke om bruken av disse modulene senere, neste gang er dette et ganske omfangsrikt tema. For nå trenger du bare å huske dette punktet.

3) "Crooked" applikasjon av databaser

Faktisk er dette et eget tema. Du bør huske at hver DB-tilkobling, hver spørring, hver ekstra tabell i en spørring, etc. – alt dette skaper en håndgripelig belastning. Men likevel bærer logikken til selve databasen, og ikke grensesnittet for å jobbe med den, størst belastning. Jeg måtte nylig optimalisere en veldig populær modul for en av de mest populære "motorene" på forumet. Som jeg umiddelbart klarte å finne ut, var nettopp den modulen hovedårsaken til betydelige bremser. Ved å legge til en liten tabell og to nye SQL-spørringer til PHP-koden har forumytelsen blitt økt med 60-80% (avhengig av siden), minneforbruket har gått ned med 5-7%! Og alt dette er praktisk talt ut av det blå. Som du kan se, er dette tilfellet når du legger til en "ekstra" tabell og "ekstra" spørringer øker ytelsen betydelig. Jeg gikk ikke på en omfattende, men på en intensiv måte, og forbedret logikken. Og etter å ha fått et virkelig bemerkelsesverdig resultat.

Vi vil snakke om databaseoptimalisering i nær fremtid. Nå skal jeg bare berøre aspektet knyttet til arbeidsgrensesnittet, både i PHP og forresten i et hvilket som helst annet programmeringsspråk.

Så, først av alt, bruk alltid filer i stedet for DB-er hvis det gir mening. Når gir det mening? La oss si at du skriver en nyhetssidemotor. Nyhetene legges til der en gang for alle. Den er ikke gjenstand for senere endringer, den er stor og solid. Det er mye enklere og mer effektivt å plassere den i en egen fil i stedet for i en database. Men anmeldelsen av nyhetene er allerede bedre i databasen. På visse sider må du selvsagt vise en liste over de siste anmeldelsene om emnet, eller en liste over tilfeldige anmeldelser. Hvis vi skriver hver anmeldelse i en egen fil, så når vi viser for eksempel 50 anmeldelser på en side, må vi koble samme antall tilsvarende anmeldelsesfiler til verket. Å skrive alle anmeldelser til samme fil er heller ikke veldig bra: med et stort antall av dem vil filen være veldig stor, og bare vokse over tid, mens ytelsen vil reduseres tilsvarende. Og det kan rett og slett være ganske upraktisk og usikker forretning - å jobbe med slike filer. En annen ting er å "kaste" våre små anmeldelser inn i databasen og "trekke ut" de nødvendige med ett enkelt spørsmål. Det samme gjelder alle data som ofte redigeres. For eksempel er det en stor dumhet å skrive en nyhetsvisningsteller på filer. Kun DB.

Når det gjelder tilkoblingen til databasen, bør den lukkes så snart det ikke er behov for det. Du bør imidlertid ikke gjøre dette hvis det fortsatt er nyttig i arbeidet med dette skriptet.

Hold styr på innholdet i variablene som søkeresultatene er tilordnet. Det er fornuftig å bruke deaktivert i situasjoner der det ikke lenger er behov for store datamengder.

4) Mangel på caching

I en rekke tilfeller er caching rett og slett uerstattelig. La oss ta en titt på et enkelt eksempel. Litt høyere, når det kom til databasen, ga jeg et eksempel med en liste over anmeldelser. Anta at vi går til en bestemt side som viser en liste med 50 anmeldelser for de siste nyhetene. Som regel kan alle velges fra databasen med en enkel spørring. Men på den annen side kan vi lage en fil på forhånd som skal inneholde alle disse 50 anmeldelsene i ferdig form. Vi trenger ikke velge dem fra databasen, formatere dem i henhold til malen vår og sette dem inn på rett sted på siden. Vi kobler bare umiddelbart alt dette fra en forhåndsformet fil.

Essensen av caching koker ned til å lage en cache fra de mest brukte og sjelden endrede dataene. For eksempel, hvor ofte må du oppdatere cachen på 50 anmeldelser? Det er tydelig at hver gang nye nyheter legges til - slik at cachen vår viser relevant informasjon. Hvor ofte vil nye nyheter bli lagt til? Anta omtrent hvert 15. minutt, dvs. opptil 100 ganger om dagen. Og hva er trafikken til dette nettstedet, hvor ofte blir disse anmeldelsene sett? På prosjektet, "motoren" som jeg utviklet, omtrent 70 tusen ganger per dag. I stedet for å utføre et utvalg fra databasen, formatere og sette inn disse anmeldelsene 70 tusen ganger om dagen, utføres det vanligvis ikke mer enn 100 ganger, resten er bare enkle inkluderinger av fullstendig ferdige data.

Du bør om mulig lage de endelige fullstendige dataene for caching, som er enkle nok til å koble til siden under utførelsen av forespørselen, uten behov for parsing, etterbehandling, maling osv.

Ikke glem at cachen ikke bare trenger å lagres i filer, og det er ikke nødvendig å lagre bare deler av vår fremtidige HTML-side i den. Og spesielt hvis det er gjenstand for hyppige, systematiske oppdateringer. For eksempel er det mye mer fornuftig å holde en liste over data om online-brukere i en database, i en tabell som Memory.

5) Buffer, komprimering, frontend http-server

Alt er veldig enkelt. I løpet av utførelsen blir alle dataene som vises til brukeren umiddelbart sendt til ham. Grovt sett, før dataene er samlet inn, utføres ikke fortsettelsen av kodekjøringen. Så hvis skriptet ditt i løpet av arbeidet sender den ferdige HTML-koden gjennom ekkofunksjonen, for eksempel, eller ved en annen metode, så overfører krypten data "bit for bit", hver gang "fryser". Det er mye smartere å sende ut data til en buffer, noe som dette:

php // initialiser buffering
ob_start (); // utfør skriptkode
//... // fullfør bufring, hent data
$ html = ob_get_contents ();
ob_end_clean ();
exit( $ html ); ?>

Aktivering av dynamisk komprimering av gjengitte HTML-sider (

ob_start (`ob_gzhandler`);

) kan komprimere dem med et gjennomsnitt på 20-60%, øke nedlastingshastigheten og redusere antall "hengende" prosesser. Har du en båndbreddebegrensning på hostingen din? Da vil dynamisk sidekomprimering gi doble fordeler.

Selvfølgelig bør det huskes at buffering øker minneforbruket litt og komprimering - en belastning på prosessoren. Men disse ofrene blir ofte mer enn kompensert for av fartsøkningen. Og ikke bare hastigheten på opprettelsen, men også hastigheten på lasting av siden.

Endelig kan en frontend http-server ta ytelsen til PHP-skriptene dine til neste nivå. Faktum er at selv med caching vil prosessene knyttet til brukerens forespørsel "henge" til brukeren aksepterer alle dataene (eller til tidsgrensen er nådd). Essensen av frontend-serveren er å umiddelbart motta data, slik at du umiddelbart kan laste ut de behandlede prosessene. Det er en slags kobling mellom brukeren og en ganske "tung" backend-server - hvor PHP-skriptene dine blir utført. Men på grunn av sin "letthet" reduserer front-end-serveren de forbrukte ressursene betydelig. Igjen, dette er et veldig bredt tema, og vi vil se nærmere på det i nær fremtid.

6) Totalt inklusive

Anta at du har laget din "motor" i PHP, fulgt alle de tidligere tipsene. Det vil nesten uunngåelig inneholde mange forskjellige inkluderinger: konfigurasjonsfiler, funksjoner, språk, etc. Poenget er at selv en normal inkludering av samme fil med funksjoner vil kreve mye tid og minne, selv om det i tillegg til funksjonene i include ikke er noen kjørbar kode, og ikke en av funksjonene kalles.

Men funksjonene er veldig forskjellige og spesifikke. Så å legge hele listen over funksjoner i én fil og inkludere den hver gang er ikke den beste løsningen. For eksempel har nettstedet brukerregistrering: for dette kan du ha en rekke spesialfunksjoner som kun brukes under registrering. Så hvorfor legge dem inn i den generelle inkluderingen av funksjoner, som kobles til hver gang du går inn på sidene på nettstedet?

Ikke overse optimaliseringen av inneslutninger. Ta ut det som ikke er universelt brukt i separate, spesialiserte inneslutninger. Et annet eksempel for forankring. Min favoritt nyhetssidemotor. Funksjonene for å legge til nyheter, kommentarer, deres kontroll og preparsing tar omtrent 1/3 av koden av det totale antallet funksjoner. Men hvor ofte trengs de? I 1 av 100 søk? Eller 1 av 200? Eller enda sjeldnere? Så hvorfor laste dem hver gang? Dette kan faktisk redusere ytelsen til løsningene dine betydelig.

7) Overflødig funksjonalisering og OOP-tymisme

Funksjoner bør bare brukes når det virkelig gir mening. La oss huske det grunnleggende formålet med funksjoner. Dette er ikke noe mer enn en takeaway

ofte brukt innenfor én syklus av programmet

deler av koden til en egen, felles del. I prinsippet er det fornuftig å plassere koden i en "separat del" selv når den utføres på en relativt usannsynlig hendelse. For eksempel ved å legge ved et bilde til et foruminnlegg. Å flytte handleren for lasting og bearbeiding av et bilde til en "separat del" vil ha en positiv effekt på ytelsen, selv om den er inkludert i en betingelse (det faktum å laste et bilde). Dessuten, hvis vi trenger denne "separate delen" bare én gang, er det bedre å kjøre den bare som en kode (inkluder), og ikke som en funksjon. Funksjoner krever alltid noen ekstra ressurser. Det samme gjelder OOP-programmering i PHP. OOP-kode bruker litt mer ressurser, så hvis du ikke er interessert i OOP-kodeformatering, er det bedre å forlate den. Jeg snakker spesifikt om OOP-formatering, siden OOP-tilnærmingen i PHP har lite å gjøre med selve konseptet OOP-programmering. Samt PHP med en klassisk forståelse av programmeringsspråk og deres oppgaver - som jeg skrev om i begynnelsen.

Nå er du kjent med 7 grunnleggende prinsipper for produktiv PHP-kode. Dette er bare - bare begynnelsen. Vi har fortsatt mye interessant, mer spesifikt materiale om dette emnet fremover.

Jeg studerte hele httpd.conf, gravde opp en haug med guider om høybelastning (de er gamle og med tvilsomme råd som "deaktiver unødvendige moduler"
En av de første modulene som bør deaktiveres for Apache, for hastighet, er støtte for .htaccess-filer, denne støtten i seg selv gir ikke ytelse, og tilstedeværelsen av disse filene er enda mer.
1) Har alle VPS en såkalt "kraftig" prosessor tregere enn på en eller annen patetisk hosting, om enn med VIP-tariff?
Nei, kanskje det er deg personlig, en dårlig VPS-hoster, eller enda verre, en tariff som "OpenVZ, vi videreselger ikke solgte ressurser ... vel, kanskje 10 ganger, men vi videreselger ikke lenger"
2) Vil FastCGI hjelpe i en slik situasjon?
FastCGI er PHP-driftsmodusen, den påvirker ikke ytelsen direkte, dessuten vil selve logikken i FCGI-operasjonen (hvis vi sammenligner Apache-FCGI og Apache-mod_php) være tregere, fordi sokkelen ("vanlig" eller unix-socket) , som innebærer nettverkskommunikasjon, i stedet for den direkte PHP-tolken" inne i "serveren. Jeg tror noe annet vil hjelpe deg (jeg skal prøve å beskrive det nedenfor).
3) Hvorfor er eAccelerator-funksjoner ikke populære (AST-bufring osv.)?
Jeg aner ikke hvorfor de ikke er populære og hvor fikk du tak i slik statistikk ... Men poenget er kanskje at eAccelerator er moralsk og fysisk utdatert, og hvis du for eksempel tror på en så banal artikkel (nei, jeg ikke arbeid med et slikt "mesterverk "CMS som" Bitrix ", det er bare den første omtalen av eAccelerator som kom til meg) - det fungerer ikke med PHP-versjoner høyere enn 5.3.
Jeg vet at mange av dem er forlatt, men dette er ikke en årsak, men en virkning.
Jeg kan ikke kommentere dette, siden du ikke antydet etterforskningen - hva egentlig. Jeg skjønner med andre ord ikke helt hva du mente med dette.
4) Hva annet kan hjelpe?
Vel, rett ut fra minnet (alternativene er kanskje ikke relatert til hverandre):
1. Avvisning av støtte for .htaccess i Apache, eller i det minste reduksjon av antallet
2. Installere Nginx som en front-end server for å betjene statisk innhold
3. Fullstendig avvisning av Apache generelt og overgangen til Nginx + FCGI (bare ikke tenk, jeg elsker Apache for dens fleksibilitet i konfigurasjon og brede muligheter, et annet spørsmål er at svært få mennesker faktisk trenger denne fleksibiliteten og få mennesker er i stand til det kompetent, effektivt og fullt ut konfigurert ... Nginx i denne forbindelse vil være mye enklere). Hvorfor FCGI? På grunn av det faktum at jeg ikke kjenner noen annen akseptabel måte for interaksjon mellom Nginx "og PHP. Konfigurasjon av FCGI-poolen er et must.
4. OpCache - fra versjon 5.5 innebygd "iskaropki", for å aktivere og konfigurere - anbefales på det sterkeste. Jeg vet ikke hvordan det er med CMS og om du bruker CMS på siden, men fra min praksis øker hastigheten på PHP-rammeverk i gjennomsnitt 8-20 ganger.
5. HHVM som alternativ
6. Bekreftelse:
a) At saken virkelig er i PHP. Spesielt er det verdt å samle alle serverloggene, for eksempel hvor lenge forespørslene varte i databasen, antallet og så videre.
b) Sjekke hastigheten til diskundersystemet ... Jeg vil ikke "stikke en finger", men på en gang leide jeg et ganske stort antall VPS "ok fra en populær hoster, og på et tidspunkt la jeg merke til at gjennomsnittet hastigheten til diskundersystemene - 1,4 Kbyte / sek., mens "feil" (som "det er umulig å skrive en blokk") var i omtrent 50% av tilfellene ... det varte ikke veldig lenge, men etter noen måneder , den samme hosteren hadde tariffer med "konvensjonell HDD", hadde av en eller annen grunn et raskere diskundersystem enn tariffer med" rask SSD "... vi kan trekke konklusjoner ...
c) Sjekk den reelle hastigheten til prosessoren, det er ikke uvanlig at den skiller seg ganske sterkt fra den angitte.

P.S. Hvis du formulerer spørsmålet(e) mer presist, kan jeg gi mer presise anbefalinger, hvis du selvfølgelig trenger dem :)

P.P.S. Det er en måte å løse problemet på generelt "head-on", den vanskeligste og kanskje den mest produktive i noen tilfeller. Dette er lakk + finjustering av det, det lar deg utstede de fleste sidene fra cachen (RAM) på nanosekunder, noen ganger lar det deg betjene mange tusen forespørsler per minutt, mens dette ikke bare er kodebufring eller noe sånt at ... dette er caching i sin helhet sider og/eller serversvar. Den lar deg blant annet «ikke berøre backend i det hele tatt», d.v.s. når en side blir forespurt, kan det hende det ikke er noen databasetilgang, eller kjøring av den samme PHP-koden (eller annen) på serversiden. Det krever ganske finjustering, er lite egnet for nettsteder "på CMS", for nettsteder på rammeverk - det krever en i utgangspunktet riktig tilnærming til utvikling og tenkning over hva og hvordan som skal/skal bufres. Med en feil tilnærming - det mest sannsynlige resultatet - vil det fungere, men ikke så raskt som vi ønsker, og deler av siden kan slutte å fungere normalt. Det finnes også andre løsninger, men med tanke på den ganske generelle formuleringen av spørsmålet, er det ganske vanskelig å snakke om dem.

Å ja, jeg glemte en viktig detalj ... Hvorfor bruker "hosting" Apache og ikke forlate det (helt)? Mest på grunn av at Apache lar deg delegere noen av innstillingene til brukeren gjennom .htaccess. Samtidig, for statikk, er det ikke uvanlig å bruke den samme Nginx, som, som du forstår, ikke tillater å delegere deler av innstillingene til brukeren på denne måten, med tanke på at den ikke er egnet for disse oppgavene og "hopper ikke over" dette (i motsetning til Apache "men inkludert av denne grunn nektet vi 99% av "hosting" (på grunn av tilstedeværelsen av Apache, og umuligheten av å bli kvitt den eller konfigurere den på egen hånd, og som et resultat av "bremsene" som følger med en slik tilnærming) ...

Ønsker dere alle en god dag.

  1. Hvis metoden kan være statisk, erklær den statisk.
  2. ekko er raskere enn utskrift.
  3. Send flere parametere til ekko i stedet for å bruke strengsammenkobling.
  4. Angi maksimalt antall passeringer av dine for-løkker før løkken, ikke mens den kjører.
  5. Slett variablene dine for å frigjøre minne, spesielt hvis de er store matriser.
  6. Pass på magiske metoder som __set, __get, __autoload.
  7. require_once er dyrt.
  8. Spesifiser fullstendige stier i include / require-konstruksjoner, mindre tid vil bli brukt på å søke etter filen.
  9. Hvis du trenger å bestemme tidspunktet da skriptet ble kjørt, bruk $ _SERVER ['REQUEST_TIME'] i stedet for tid ().
  10. Prøv å bruke strncasecmp, strpbrk og stripos i stedet for regulære uttrykk.
  11. str_replace er raskere enn preg_replace, men strtr er raskere enn str_replace.
  12. Hvis en funksjon, som strengerstatningsfunksjoner, kan akseptere både matriser og enkelttegn som argumenter, og hvis argumentlisten din ikke er for lang, bør du vurdere å skrive flere identiske erstatningsuttrykk, gå gjennom ett tegn om gangen, i stedet for én streng. kode som tar en matrise som et søk og erstatt-argument
  13. Det er bedre å velge utsagn ved å bruke en else if-setning enn å bruke flere if-setninger.
  14. Feilundertrykkelse ved bruk av @ er veldig sakte.
  15. Bruk Apache mod_deflate-modulen.
  16. Lukk DB-tilkoblingene når du er ferdig med å jobbe med dem.
  17. $ row ["id"] er syv ganger raskere enn $ row.
  18. Feilmeldinger er dyre
  19. Ikke bruk funksjoner inne i en for loop-tilstand, som denne: for ($ x = 0; $ x< count($array); $x). В данном случае функция count() будет вызываться с каждым проходом цикла.
  20. Å øke en lokal variabel i en metode er den raskeste. Å øke en lokal variabel i en funksjon fungerer nesten på samme måte.
  21. Å øke en global variabel er dobbelt så sakte som en lokal.
  22. Å øke en objektegenskap (dvs. $ this-> prop ++) er tre ganger langsommere enn en lokal variabel.
  23. Å øke en udefinert variabel er 9-10 ganger langsommere enn en tidligere initialisert.
  24. Å erklære en global variabel uten å bruke den i en funksjon bremser også ting (med omtrent samme mengde som å øke en lokal variabel). PHP sjekker sannsynligvis om det finnes en variabel.
  25. Hastigheten på metodeanrop avhenger tilsynelatende ikke av antall metoder som er definert i klassen. Jeg la til 10 metoder til testklassen (før og etter testmetoden), ingen ytelsesendring.
  26. Metoder i avledede klasser er raskere enn de som er definert i basisklassen.
  27. Et funksjonskall med én parameter og en tom funksjonskropp er i gjennomsnitt 7-8 trinn av den lokale variabelen ($ localvar ++). Å kalle en lignende metode er selvfølgelig omtrent 15 trinn.
  28. Strengene dine definert med "heller enn" vil bli tolket litt raskere fordi PHP ser etter variabler i "..", men ikke "...". Selvfølgelig kan du bare bruke dette når det ikke er noen variabler i strengen din.
  29. Kommaseparerte linjer skrives ut raskere enn punktdelte linjer. Merk: dette fungerer bare med ekkofunksjonen, som kan ta flere linjer som argumenter.
  30. PHP-skript vil bli behandlet minst 2-10 ganger langsommere enn statiske HTML-sider. Prøv å bruke flere statiske HTML-sider og færre skript.
  31. PHP-skriptene dine kompileres på nytt hver gang hvis skriptene ikke er bufret. Skriptbufring øker vanligvis ytelsen med 25-100 % ved å fjerne kompileringstiden.
  32. Buffer så mye som mulig. Bruk memcached, et høyytelses inne-minnet objektbufringssystem som forbedrer hastigheten til dynamiske webapplikasjoner ved å gjøre det enklere å laste databaser. Bufret mikrokode er nyttig fordi det hindrer skriptet ditt fra å kompileres igjen for hver forespørsel.
  33. Når du arbeider med strenger, når du skal sørge for at strengen har en viss lengde, vil du selvfølgelig bruke strlen () funksjonen. Denne funksjonen er veldig rask, fordi den ikke utfører noen beregninger, men returnerer kun den allerede kjente strenglengden som er tilgjengelig i zval-strukturen (den interne C-strukturen som brukes når man arbeider med variabler i PHP). Men fordi strlen () er en funksjon, vil den gå tregt ved å kalle noen operasjoner, for eksempel å konvertere en streng til små bokstaver og søke i en hash-tabell, først hvoretter hovedhandlingene til funksjonen vil bli utført. I noen tilfeller kan du øke hastigheten på koden din ved å bruke isset ()-trikset.
    Var: if (strlen ($ foo)< 5) { echo «Foo is too short»; }
    Nå: if (! Isset ($ foo (5))) (ekko "Foo er for kort";)
    Isset () er raskere enn strlen () fordi, i motsetning til strlen (), er isset () ikke en funksjon, men en språkkonstruksjon. Dette betyr at isset () praktisk talt ikke har noen strenglengde overhead.
  34. Å øke eller redusere en variabel med $ i ++ er litt langsommere enn ++ $ i. Dette er spesifikt for PHP, og du trenger ikke å endre C- og Java-koden din på denne måten og tenker at den vil kjøre raskere, dette vil ikke skje. ++ $ i vil være raskere i PHP fordi i stedet for fire kommandoer, som med $ i ++, trenger du bare tre. Post inkrement brukes vanligvis når du oppretter midlertidige variabler som deretter økes. Mens pre-increment øker verdien av den opprinnelige variabelen. Dette er en av måtene Zend Optimizer optimerer PHP til bytekode. Dette er imidlertid en god idé, siden ikke alle bytekodeoptimalisatorer optimaliserer dette, og det er også ganske mange skript som kjører uten optimalisering til bytekode.
  35. Ikke alt trenger å være OOP, det er ofte overkill, siden hver metode og objekt tar opp mye minne.
  36. Ikke definer hver datastruktur som en klasse, arrays kan være veldig nyttige
  37. Ikke overbryt metodene. Tenk på hva du faktisk vil gjenbruke.
  38. Du kan alltid bryte ned koden i metoder senere, om nødvendig.
  39. Bruk utallige forhåndsdefinerte funksjoner.
  40. Hvis koden din inneholder funksjoner som tar svært lang tid å fullføre, bør du vurdere å skrive dem i C som en utvidelse.
  41. Profiler koden din. Profilering vil vise deg hvor lang tid det tar å utføre deler av koden din.
  42. mod_gzip er en Apache-modul som lar deg komprimere dataene dine på et øyeblikk og kan redusere mengden data som overføres med opptil 80 %.

I disse dager, når dedikert internettbåndbredde har blitt normen, trenger du egentlig ikke å bekymre deg for sidestørrelsen. Det er imidlertid fortsatt verdt å være oppmerksom på. Hvis du ønsker å redusere belastningen på serveren, reduser antall HTTP-forespørsler – det finnes flere teknikker for dette. Denne opplæringen vil dekke noen få PHP-triks (bufring, komprimering).

1. Kombinere CSS-filer med PHP.

Som webutviklere deler vi ofte stiler på tvers av flere stilark for en mer logisk struktur og enkel modifikasjon senere. Dette øker imidlertid antallet forespørsler til serveren, noe som fører til tregere sidelasting. Ved å bruke PHP kan vi slå to fluer i en smekk: ha flere stilark, og bruke bare ett søk for å få tilgang til dem alle.

Forberedelse

Før vi optimaliserer CSS-filene, trenger vi at stilene fungerer. La oss lage noen stilfiler:

// main.css
// CSS for eksempel

kropp (
bredde: 800px;
margin: 0 auto;
farge: grå;
}

#wrapper (
marg-top: 30px;
bakgrunn: url (../ bilder / cats.png);
}
// typography.css
// CSS for eksempel

kropp (
font-familie: Arial, san-serif;
font-weight: fet;
}

sterk (
skriftstørrelse: 120 %;
}
// forms.css
// CSS for eksempel

skjema (
stilling: pårørende;
topp: 400px;
z-indeks: 99;
}

input (
høyde: 50px;
bredde: 400px;
}

Vi må trekke ut innholdet i alle filene og slå dem sammen i en bestemt rekkefølge. Dette betyr at skriptet vårt skal hente navnene på stilarkene gjennom URL-parametrene, åpne disse filene og koble dem til.

// Definer variabler
$ cssPath = "./css/";
if (isset ($ _ GET ["q"))) (
$ filer = $ _GET ["q"];
// Få en rekke filer


foreach ($ filer som $ nøkkel => $ fil) (
}

$ cssData = "";
foreach ($ filer som $ fil) (

fclose ($ filhåndtak);
}
}
// Fortell nettleseren at vi har en CSS-fil
if (isset ($ cssData)) (
echo $ cssData;
) annet (
}
?>

// Definer variabler
// --- MERK: STIER MÅ ETTERSTREK ---
$ cssPath = "./css/";
if (isset ($ _ GET ["q"))) (
$ filer = $ _GET ["q"];
// Har en rekke filer!

// La oss sørge for at det ikke er noen skumle symboler i filnavnene :).
foreach ($ filer som $ nøkkel => $ fil) (
$ files [$ key] = str_replace (array ("/", "\\", "."), "", $ fil);
}

Denne koden setter banen til stiler-mappen og ser etter filer. Banen til mappen må ha skråstreker i begynnelsen og på slutten av mappenavnet, ellers får vi mange feil. Deretter sjekker vi hvert filnavn og fjerner prikker og/eller skråstreker.

$ cssData = "";
foreach ($ filer som $ fil) (
$ cssFileName = $ cssPath. $ fil. ".css";
$ fileHandle = fopen ($ cssFileName, "r");

$ cssData. = "\ n". fread ($ fileHandle, filstørrelse ($ cssFileName));
fclose ($ filhåndtak);
}
}

Nå må vi lage et generelt stilark fra filene. For å gjøre dette, kjører vi en løkke som går gjennom en rekke filer, åpner hver fil og setter den sammen til en enkelt fil. "\ n" legger til en ny linje for orden og renslighet. Filstørrelsen ()-funksjonen brukes til å finne ut lengden på en fil og sende den til fread ().

// Fortell nettleseren at vi har en CSS-fil
header ("Innholdstype: tekst / css");
if (isset ($ cssData)) (
echo $ cssData;
echo "\ n \ n // Generert:". dato ("r");
) annet (
echo "// Filer er ikke tilgjengelige eller ingen filer spesifisert.";
}
?>

Den siste delen av koden sender alle stilene til nettleseren. Dette betyr at vi må fortelle PHP at vi sender CSS-informasjon og at PHP bør informere nettleseren om det. Vi gjør dette med header () funksjonen, og setter Content-type: text / css. Deretter sender vi CSS til klienten. Men før det sjekker vi for tilstedeværelsen av CSS-stiler i filen. Hvis de ikke er der, betyr det at navnene på CSS-filene ikke ble overført. Hvis vi har filer, overfører vi dem og legger til en melding om generasjonen.

Undersøkelse

Nå er tiden inne for å teste manuset. Opprett en mappe og filer i den. Ta en titt på mappestrukturen nedenfor. Hvis du trenger en annen struktur, så ikke glem å endre banene.

Last nå opp alle filene til roten av nettstedet og få tilgang til index.php-filen via nettleseren din. Du bør bli møtt med uttrykket "Filer ikke tilgjengelige eller ingen filer spesifisert". Dette betyr at vi ikke har gitt navn på filene som må kobles til. Den gode nyheten er imidlertid at alt fungerer uten feil. La oss prøve å skrive ut "index.php? Q = main" i nettleseren. Du vil se innholdet i main.css-filen på skjermen. Hvis vi trenger å trekke ut flere filer og kombinere dem, må vi sende følgende forespørsel "index.php? Q = main & q = forms". Som du kan se, kan vi gjenta "q =" så mange ganger vi vil. Du kan kombinere minst 50 stilark til én fil.

Konklusjon

Denne metoden kan være svært nyttig og har mange fordeler. Du kan ha et felles stilark for hele nettstedet, og et eget for eksempel for sider med skjemaer.

En liten advarsel: hvis du legger index.php-filen i en hvilken som helst mappe (ikke i CSS-mappen), må du skrive relative stier til bakgrunnsbilder som om index.php var stilarket ditt. Dette er hva nettleseren vil tenke.

2. Fjerne tomme linjer fra HTML og CSS

Mange av oss bruker mange tomme linjer når vi skriver kode. Den gode nyheten er at tomme linjer i PHP ikke sendes til nettleseren. Imidlertid sendes de i HTML.

Blanke linjer bruker ubetydelig mengde trafikk. Hvis trafikken til nettstedene er stor, kan denne lille tallet vokse til en betydelig. Det er her PHP kommer oss til unnsetning.

Forberedelse

Nedenfor er kodene for HTML- og CSS-filer.

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


Hei en side!






Lorem Ipsum dol ...





kropp (
min-høyde: 800px;
bakgrunn: svart;
skriftstørrelse: 18px;
}
#wrapper (
bredde: 960px;
margin: 20px auto;
polstring: 15px;
}
#header h1 (
tekstinnrykk: -99999em;
bakgrunn: url (../ bilder / header.png);

Display: blokk;
bredde: 100 %;
høyde: 48px;
}
#Hoveddelen (
font-weight: fet;
}

Fordelen med dette skriptet er at det kan fungere med både HTML og CSS samtidig. Skriptet laster filen, fjerner alle tomme linjer, etterlater bare 1 mellomrom, slik at ordene ikke er sammenkoblet til en helhet.

$ fileDirectory = "";
$ fil = $ _GET ["q"];
$ ext = $ navnExplode;

// Se etter hackere
dø ("Hackere ...!");
) annet (
// La oss begynne


// Underverk av regulære uttrykk

fclose ($ håndtak);
// Vis data
if ($ ext == "css") (
header ("Innholdstype: tekst / css");
}
echo $ newData;
}
?>

Lær mer om hver del av koden

Vi får navnet på filen og sjekker typen. Deretter trekker vi ut alle dataene og fjerner mellomrom og tomme linjer. Denne metoden er den mest primitive og vil ikke fjerne alle tomme linjer, men den vil håndtere de fleste. Og det er bare noen få linjer med kode.

$ fileDirectory = "";
$ fil = $ _GET ["q"];
$ nameExplode = eksplodere (".", $ fil);
$ ext = $ navnExplode;
$ filnavn = $ filkatalog. $ fil;

Denne koden setter de nødvendige variablene. Igjen sender vi all data gjennom "q". Mappen for filer er også definert her.

If ($ ext! = "Css" OG $ ext! = "Htm" OG $ ext! = "Html") (
// Se etter hackere
dø ("Hackere ...!");
) annet (

Her sjekker vi om filen virkelig er CSS eller HTML.

// La oss begynne
$ handle = fopen ($ filnavn, "r");
$ filData = fread ($ håndtak, filstørrelse ($ filnavn));
// Underverk av regulære uttrykk
$ newData = preg_replace ("/ \ s + /", "", $ fileData);
fclose ($ håndtak);
// Vis data
if ($ ext == "css") (

header ("Innholdstype: tekst / css");
}
echo $ newData;
}
?>

Denne koden åpner og leser filen – og fjerner deretter så mye mellomrom som mulig. Dette oppnås ved å bruke regulære uttrykk. Alle mellomrom, tabulatorer, tomme linjer blir funnet og erstattet med et mellomrom.

Virker det?

Hvis du skriver "index.php? Q = css.css" i nettleseren din, vil du se én linje med CSS. Så alt fungerer! Hvis du åpner kildekoden til siden, vil du se det samme bildet. Med denne metoden har vi redusert CSS-filen på 314 tegn til 277 tegn. HTML-fil med 528 til 448 tegn. Ikke dårlig for 15 linjer med kode.

Konklusjon

Dette er et godt eksempel på hvordan vi kan gjøre mye med bare noen få linjer med kode. Hvis du tar en titt på kildekoden til nettsteder som Google, vil du legge merke til at det nesten ikke er tomme linjer.

3. Bufre PHP-skript.

Jeg vil vise deg hvordan du setter opp caching for skriptene dine ved å bruke eksemplet ovenfor. Målet er å få fart på nettstedet. Hovedpoenget er veldig enkelt - data vil ikke bli generert hver gang du går inn på siden. De vil bli lagret i cachen.

For å legge til caching, må vi legge til tre ting til skriptet vårt. Først må vi samle alle dataene i et skript og generere en fil som er unik for dette settet med innlagte data. For det andre må vi finne cache-filen og sjekke hvor "fersk" den er. For det tredje må vi bruke en bufret kopi eller generere en ny hurtigbufferfil for senere bruk.

Mer informasjon

$ fileDirectory = "";
$ fil = $ _GET ["q"];
$ nameExplode = eksplodere (".", $ fil);
$ ext = $ navnExplode;
$ filnavn = $ filkatalog. $ fil;
// - VI HAR NOK DATA TIL Å GENERE ET CACHE-FILNAVN HER -
if ($ ext! = "css" OG $ ext! = "htm" OG $ ext! = "html") (
// Se etter onde mennesker ...
dø ("Hackere ...!");
) annet (

// - VI KAN AVSTYRE OG SE ETTER DEN BUFFREDE VERSJONEN HER -

// La oss komme i gang
$ handle = fopen ($ filnavn, "r");
$ filData = fread ($ håndtak, filstørrelse ($ filnavn));
// Nå for litt regex-trolldom!
$ newData = preg_replace ("/ \ s + /", "", $ fileData);

Flukk ($ håndtak);
// Tid for å sende ut dataene.

// - NÅ KAN VI LAGRE DE NYE DATA OM NØDVENDIG OG UTGI DATA -

If ($ ext == "css") (
header ("Innholdstype: tekst / css");
}
echo $ newData;
}
?>

$ fileDirectory = "";
$ fil = $ _GET ["q"];
$ nameExplode = eksplodere (".", $ fil);
$ ext = $ navnExplode;
$ filnavn = $ filkatalog. $ fil;
$ cacheName = "./cache/". $ navnExplode. $ navnExplode. ".tmp";
if ($ ext! = "css" OG $ ext! = "htm" OG $ ext! = "html") (
// Hackere
print_r ($ ext);
dø ("Hackere ...!");
) annet (
if (fil_eksisterer ($ cacheName) OG filemtime ($ cacheName)> (tid () - 86400)) (


fclose ($ cacheHandle);
$ isCached = TRUE;
) annet (
// La oss begynne
$ handle = fopen ($ filnavn, "r");
$ filData = fread ($ håndtak, filstørrelse ($ filnavn));
// Underverk av regulære uttrykk
$ newData = preg_replace ("/ \ s + /", "", $ fileData);
fclose ($ håndtak);
// Buffer


fclose ($ cacheHandle);
$ isCached = FALSE;
}
// Vis data
if ($ ext == "css") (
header ("Innholdstype: tekst / css");
if ($ er bufret) (

}
) annet (
if ($ er bufret) (
ekko "";

}
}
echo $ newData;

Forklaring

I dette skriptet er funksjonen med å oppdatere cachen hver 24. time lagt til. Det er behagelig. Hvis du for eksempel har endret noe på siden, kan du vente i 24 timer eller tømme hurtigbufferen.

$ cacheName = "./cache/". $ navnExplode. $ navnExplode. ".tmp";

Denne kodebiten tar ut filnavnene og utvidelsene deres, limer dem sammen og legger dem til hurtigbufferen med riktig ".tmp"-utvidelse.

If (fil_eksisterer ($ cacheName) OG filemtime ($ cacheName)> (tid () - 86400)) (
$ cacheHandle = fopen ($ cacheName, "r");
$ newData = fread ($ cacheHandle, filstørrelse ($ cacheName));
fclose ($ cacheHandle);
$ isCached = TRUE;
) annet (

Her sjekker vi tilstedeværelsen av en lagret cache og om den ble opprettet i løpet av de siste 24 timene (verdien i sekunder kan endres til en hvilken som helst annen). Hvis begge betingelsene er oppfylt, åpner du filen og pakker ut innholdet for å erstatte resultatet av skriptet med det. Vi har også satt $ isCached true for å vise flere meldinger på slutten.

// La oss cache!
$ cacheHandle = fopen ($ cacheName, "w +");
fwrite ($ cacheHandle, $ newData);
fclose ($ cacheHandle);
$ isCache = FALSE;
}

Vi cacher resultatet av skriptet for bruk med videre anrop. Vi åpner bare filen i skrivemodus, dumper informasjonen der og lukker.

// Tid for å sende ut dataene.
if ($ ext == "css") (
header ("Innholdstype: tekst / css");
if ($ er bufret) (
echo "// Hentet fra hurtigbufferfilen. \ n";
}
) annet (
if ($ er bufret) (
ekko "";
}
}

Denne delen av manuset er litt modifisert slik at vi kan se resultatet av arbeidet. Hvis innholdet i filen har blitt hentet fra cachen, kan vi legge til en melding om det.

Prøver

Hvis vi bruker skriptet igjen, vil vi ikke se endringene før vi oppdaterer siden. Nedenfor vil vi se en inskripsjon om at filen er hentet fra cachen.

Konklusjon

Å raskt kunne legge til enkel caching i et hvilket som helst skript betyr at du er på vei i riktig retning. Et skript med caching vil redusere belastningen på enhver server betydelig.

Oppsummering

I denne opplæringen viste jeg deg flere praktiske og enkle måter å øke hastigheten på nettstedet ditt ved å bruke PHP.

Fra forfatteren: enhver utviklere med respekt for seg selv bekymrer seg for "skjebnen" til koden hans. Han prøver å gjøre applikasjonen så praktisk og rask som mulig og øke feiltoleransen. Men PHP-optimalisering vil ikke alltid tillate deg å nå disse høydene.

Ikke behandle hånden din hvis benet er halt!

Beklager den irske folkeaforismen! Men det gjenspeiler hele essensen av problemet i selve "bull's-eye". Oftere enn ikke vil kodeoptimalisering ikke tillate deg å forbedre ytelsen til det genererte skriptet eller ressursen. Og i tilfellet er alt ekstremt komplisert på grunn av det store antallet faktorer som du (som utvikler) rett og slett ikke kan påvirke.

Når det gjelder fenomenene utenfor kontroll, mener jeg hastigheten på Internett-tilkoblingen, belastningen på serveren, OS-innstillingene på klientmaskinen, kraften til brukerens PC-maskinvare. Du kan ikke påvirke alle disse komponentene. Og til slutt viser det seg at optimaliseringen av PHP-koden ikke vil gi et fullverdig resultat.

Hva gjenstår under nettutviklerens myndighet:

Serverinnstillinger - begrenset. Ved å angi parametere gjennom Apache-konfigurasjonsfilen httpd.conf kan du angi antall underordnede prosesser, tidsavbrudd for socket-tilkobling, utgangsbufferstørrelse for TCP/IP-tilkobling, inaktiv tid og annet.

Språkkjerneinnstillinger - gjennom parameterne spesifisert i php.ini-filen. Lar deg angi bufferverdier, endre maksimal skriptutførelsestid, feilhåndtering, loggbehandling og andre innstillinger.

PHP bildeoptimalisering - mer om det senere. Optimalisering av programkoden - lar deg "spare" ressurser og forbedre ytelsen.

For eksempel må du vite at ekko er raskere enn utskrift. Det er bedre å slå av visningen av feilmeldinger etter feilsøking for å spare ressurser. Bruk ekko i stedet for strengsammenkobling. Klasseobjekter og metoder () spiser opp mye minne.

Arbeid med bilder

Jeg er ikke en tilhenger av bildebehandling på serversiden. Det fører også til sløsing med dyrebare ressurser, som alltid er knappe på hosting. Det viser seg at ved å spare på en, kaster vi bort andre «reserver».

Mer optimalt er muligheten for å laste opp bilder til en tredjepartstjeneste, hvorfra de allerede er lastet opp i en optimalisert form til brukerens nettleser på en gitt adresse. Det finnes mange slike tjenester på nettet. Jeg vil bare nevne noen av dem: kraken.io, TinyPNG

Som du kan se, er kunnskap om PHP søkemotoroptimalisering også viktig for profesjonelle utviklere.

I tillegg har den egne innebygde verktøy for å «lyse opp» bilder. For eksempel funksjonen imagecopyresampled (). Det reduserer vekten av innholdet ved å prøve og endre størrelsen på bildet. Brukseksempel:

header ("Innholdstype: bilde / jpeg");

$ fil = "eksempel.jpg";

$ img_obrabot = imagecreatetruecolor (200, 100);

$ img_orig = imagecreatefromjpeg ($ fil);

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

imagejpeg ($ img_obrabot);

Hva annet kan du

Ikke glem å bruke klientsideoptimalisering med PHP. Til en viss grad kan serveren påvirke klientnettleseren gjennom Cache-Control, så vel som attributtene til denne overskriften: post-check, max-age og andre.

I tillegg lar Last-Modified og ETag-hodene deg kontrollere tilstanden til hurtigbufferen på klientmaskinen. De setter en unik identifikator for å endre hver fil. Takket være dette sender ikke serveren ressurser på nytt, men bare 304 statussvar.

I denne artikkelen tok vi ikke opp spørsmålet om optimalisering ved bruk av PHP FPM. Men for vurderingen er det nødvendig med en egen artikkel. Og det var alt for i dag. Til neste gang!