Kjapp og trygg hosting for Wordpress

Optimalisering av PHP - måling

Kenneth Dreyer

Well-Known Member
Hei,

Har kodet en stund i PHP nå, og skal snart starte på en webapplikasjon som skal ha mulighet til å bli brukt av opp til mange titusener mennesker i minuttet. Jeg må da begynne å fokusere på mest mulig optimal kode. Hvordan måler du din programmering?

  • Hvordan kan man måle antall queries uten å bruke for mye ressurser? Lønner det seg å teste ut dette på betatesten, og fjerne målingsfunksjonen på live-versionen?
  • Hvordan måler du optimaliteten av selve koden din? F.eks løkkene osv.
 

tyr897

Medlem
Hvis du skal begynne på en stor applikasjon er struktur prioritet én, siden optimaliserer du.

Når det gjelder å strukturere anbefaler jeg å bruke et rammeverk, eller ihvertfall innarbeide et "design pattern", som f.eks. MVC som gjerne er det mest aktuelle. Dette fører til at du ganske lett finner flaskehalsene, samtidig som det holder applikasjonslogikken godt oversiktlig.

Å måle spørringer gjør du uansett, da det så og si alltid er mest hensiktsmessig å bruke et eller annet slags abstraksjonslag mot databasen. Å fjerne dette laget sparer du lite på, med mindre du bruker noe veldig tungt noe (AdoDB kan være litt drøyt iblant..). Det er adskillig mer å spare på å strukturere databasen skikkelig og optimalisere spørringer og indekser.

Bruk bytecode caching (eAccelerator.net er gratis) og generell caching aktivt. Er det spørringer som går mye igjen, så cache resultatet (les: memcached, google it ;)). Inkluder filer etterhvert som du trenger de, ingen vits i å la php parse mer enn nødvendig.

Ikke bruk templates, ihvertfall ikke uten å kompilere de slik f.eks. Smarty gjør. PHP kan fint brukes som template språk, det bare krever littegrann mer innsikt av designeren (og hvor vanskelig er det strangt tatt å skrive <?=$var?> istedenfor {$var} el. [jeg liker short tags, så et php.ini alternativ jeg ville beholdt]).

Slå av unødvendige php.ini alternativer; register_globals, magic_quotes o.l. Alt du ikke trenger, disabler du.

Vurder om du faktisk trenger kraften til apache, veldig ofte kan f.eks. lighttpd være et minst like godt alternativ. Prøv også å la php ta det meste av url rewritingen (dvs. oversett rett til index.php/foo/bar/osv).

Når du begynner å nærme deg ferdig bruker du en profiler til å finne ut hvor koden din må forbedres, xdebug er fint til slikt.

Da tror jeg at jeg har dekket det viktigste ihvertfall.
 

Kenneth Dreyer

Well-Known Member
Når det gjelder å strukturere anbefaler jeg å bruke et rammeverk, eller ihvertfall innarbeide et "design pattern", som f.eks. MVC som gjerne er det
...

MVC er nytt for meg, men det virker uten tvil spennende, så dette er noe jeg skal se inn på! Har du god erfaring med dette selv, og isåfall - hvilket rammeverk anbefaler du? Jeg skal nevnes at det er en side for brukerene, hvor brukerene vil styre 95% av innholdet.

Å måle spørringer gjør du uansett, da det så og si alltid er mest hensiktsmessig å bruke et eller annet slags abstraksjonslag mot databasen
...
Abstraksjonslag mot databaser er planlagt, samtidig som jeg skal pusse opp på å skrive mest mulig optimale spørringer.
Database struktur er noe alle tror de lærer fort, og jeg er selv en av dem. Kommer til å lese litt på dette området også, slik at jeg vet jeg kan jobbe mest mulig optimalt på dette punktet også. Og caching skal foregå både på PHP og databaser.

Ikke bruk templates, ihvertfall ikke uten å kompilere de slik f.eks. Smarty gjør. ...
Dette skal ikke være et system som skal være ment for salg eller installering så mange andre plasser enn den ene gjeldende siden, så hverken språkfiler eller templatefiler vil bli nødvendig!

Slå av unødvendige php.ini alternativer; register_globals, magic_quotes o.l. Alt du ikke trenger, disabler du.
Disse er allerede skrudd av på testserveren. Kom gjerne med flere tips om du har noen.

Vurder om du faktisk trenger kraften til apache, veldig ofte kan f.eks. lighttpd være et minst like godt alternativ. Prøv også å la php ta det meste av url rewritingen (dvs. oversett rett til index.php/foo/bar/osv).
Dette punktet hadde jeg ikke tenkt på i det heletatt. Er det merkbart treigere å la apache (eller annen webdeamon) ta seg av rewritingen i forhold til å ta det direkte i PHP?

Da tror jeg at jeg har dekket det viktigste ihvertfall.
Meget informativ tråd. Fikk meg til å sitte oppe nå klokken 4 om natten bare for å lese masse informasjon!

Og forresten, velkommen til forumet :)
 

tyr897

Medlem
MVC er nytt for meg, men det virker uten tvil spennende, så dette er noe jeg skal se inn på! Har du god erfaring med dette selv, og isåfall - hvilket rammeverk anbefaler du?

Selv liker jeg å styre og stelle med det meste selv, så holder meg til for øyeblikket et relativt lettvekt rammeverk, CodeIgniter. Det er også forholdsvis enkelt å komme igang med, og har et meget godt brukermiljø rundt seg. Store drawbacket er kanskje at det mangler en skikkelig ORM, men jeg liker som sagt å ordne det selv.

Disse er allerede skrudd av på testserveren. Kom gjerne med flere tips om du har noen.

Nå har jeg forsåvidt ikke noen nøyaktig oversikt, men rett og slett alt du ikke trenger. Krever nesten en manuell gjennomgang. Også et poeng at du gjerne kan kompilere en tilpasset php versjon, slik at du ikke tar med masse moduler du ikke trenger. Jo mindre footprint, jo bedre.
Noen du ihvertfall kan slå av om du ikke trenger er register_long_arrays og register_argc_argv.

Dette punktet hadde jeg ikke tenkt på i det heletatt. Er det merkbart treigere å la apache (eller annen webdeamon) ta seg av rewritingen i forhold til å ta det direkte i PHP?

Nja. Det er et perfomance hit, men poenget mitt er vel mer at php fort må ta seg av dette uansett. Med andre ord ingen vits å gjøre det to ganger. Samtidig får man gjerne én enkelt regex til å få ut det du trenger av variabler i php scriptet, istedet for en lang liste i .htaccess (eller lighttpd.conf). Kan i parantes bemerkes at CodeIgniter benytter seg av at scriptet ditt kalles som index.php/controller/action/arg1/arg2 ev. index.php/controller/action/var/val etc.

Og forresten, velkommen til forumet :)

Takk for det :)

Nå blir en del av dette flisespikkeri. De store besparelsene kommer gjennom skikkelig gjennomgang av koden (profiler), databasestruktur og spørringer, samt caching. Vil forresten igjen anbefale å bruke lighttpd fremfor apache, som ser ut som et fullgodt alternativ i ditt tilfelle (egen server, formoder jeg, ikke masse virtuelle kontoer etc). Ressursbesparelsen er vesentlig. Kan også være verdt å merke seg at man bør bruke PHP5 generelt, og FastCGI mot lighttpd. PHP5 er raskere enn PHP4, utifra de benchmark jeg har lest. FastCGI er raskere enn CGI (duh), og i lighttpd er ikke mod_php et alternativ (litt usikker på perfomance på mod_php vs FastCGI, men lighttpd gruser uansett apache).

MySQL kan du nok få litt ut av også med å tukle litt med innstillingene, men det krever nok en del mer innsats og blir fort individualisert. En røff gjennomgang her, mens et litt mer dyptgående utdrag ligger her. Å tweake MySQL inngående kan kanskje fort bli litt i meste laget, ihvertfall for min del ;)
 
Sist redigert:
Topp