PHP prestanda, funcion vs include + lite andra optimeringar, tips?

Permalänk
Medlem

PHP prestanda, funcion vs include + lite andra optimeringar, tips?

Tjenare!

Trots att jag använt mig av PHP ett bra tag nu så är det fortfarande lite nybörjarfrågor som jag undrar över:
(ursäkta att det blev så mycket text, hoppas ni har ork )

Mina hobbyprojekt är i ständig utveckling, gör dom endast för skojs skull, brukar gå i cykler: designa - koda - optimera kod - optimera kod ännu mer - minska antalet http request - minska css:en med 20% - släng allt - gör om samma sida med samma funktioner från scratch med allt man lärt sig med föregående version osv osv så går det runt så i all evighet.

Men nu tänkte jag böka lite mer med PHP, allt jag kodar med PHP känns som haffsverk och har säkerligen urdålig prestanda (med tanke på att PHP redan är slött = ) så jag tänkte använda best practice redan från början nu och tänkte kolla prestandan i dom absolut enklaste koderna. (svårt att prestandatesta på storskalig nivå på sin egna lilla inaktiva server så svårt att sätta upp en egen mätmiljö)

Har läst tips från dom lite större företagen om vad dom anser om optimeringar, tex yahoo, google och facebook men har inte sett det jag efterfrågar vara dokumenterat någonstans i större utsträckning, visst står det endel i PHP:s dokumentation men nja.

Ignorera simpelheten i koden och syntaxfelen och ooptimerad html, det är själva principen jag frågar efter.

1) Är det någon som helst prestandaskillnad på include och att skapa en funktion?

Låt säga att man skall ha en meny som är likadan på varenda sida, då kör man allt som oftast med include:

Från index.php och alla andra sidor:

<?php 'menu.php'; ?>

menu.php:

<div id="main-menu"> <ul> <li><a href="index.php">Hem</a></li> <li><a href="recensioner.php">Recensioner</a></li> </ul> </div>

Men om man gör en funktion av det istället, samlar alla simpla funktioner i en fil osv osv:

<?php menu() ?>

function.php

function menu() { echo '<div id="main-menu"> <ul> <li><a href="index.php">Hem</a></li> <li><a href="recensioner.php">Recensioner</a></li> </ul> </div>' ;}

Vilket sätt är lämpligast i prestandasynpunkt, skiljer antalet request osv? Vore kul med era synpunkter på det. Jag tänkte mest på att om man gör en funktion av det och lägger in i en gemensam fil så kan man dels köra scriptet och sen cacha resultatet, men det kan man ju med include med så ja...

2) "Nestlade" funktioner?
Vet ärligt talat inte om man kallar det för nestlade funktioner men iaf, låt säga att man på ett smart sätt återanvänder element och funktioner på flera ställen på en sida och istället för att separera skiten såhär:

<?php header() ?>
<?php menu() ?>
<?php submenu() ?>

Så kör man istället:

<?php header() . menu() . submenu() ?>

Tjänar man något på att göra det sistnämnda? Färre request? Loopas koden mm? (ja, i mitt exempel är det onödigt att inte bara lägga allt i header() men som sagt, det är principen som efterfrågas)

3) Includera fil från en annan server?
Säg att din nuvarande server går ner på knäna, du har redan gjort allt vad du kunnat genom att optimera alla koder sidan använder sig om, du har separat server för dina bilder och filmer, du har en annan server som hostar dina bilder (som sidan i sig använder sig av), script och css, en annan server för databas. Trots dina försök är sidan extremt trög och tyvärr har du inte tillgång till någon lastbalanserare, inte ens RR så du försöker dela upp sidan i ännu mer separata bitar.

Hur gör man då med PHP? Såvitt jag förstår så kan man använda sig av en separat url vid include, require osv MEN det verkar som om scriptet körs på den där servern, vilket kan vara bra så lite av loaden görs av en annan server, MEN eftersom den först kör scriptet på den separata servern och sedan skickar resultatet till huvud webbservern då betyder väl det att det är svårt att lägga över funktioner som är beroende av andra funktioner som INTE ligger på servern scriptet körs på? Vilken typ av funktioner eller delar av PHP kan man tjäna på att lägga över och köra på en separat server för att sedan använda svaret på huvudservern?

(Ja jag vet, en lastbalanserare eller någon annan lösning är ju vettigast men som sagt igen, för sakens skulls bara)

Extremt tacksam för svar och tips.

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk

1. Jag kan inte ge dig någon jämförelse på prestanda men att inte öppna en annan fil känns ju snabbare, dock blir det fulare och mer svårläst kod att lägga det i funktioner.
Det blir dock ingen märkbar skillnad i tid mellan dessa två vad jag kan tänka mig, så här optimerar man inte direkt mycket. Stora sidor (till exempel Wikipedia) inkluderar mängder med filer och gör mängder med databasanrop per sidvisning.

2. <?php ett() . tva() . tre(); ?> Funkar mig veterligen inte, däremot funkar:
<?php echo ett() . tva() . tre(); ?> men jag ser inte minsta anledning till att göra på det sättet.
Ditt andra exempel på den här punkten är däremot långsamt och felaktigt om man ska vara petig, ska de tre funktionsanropen ske tillsammans ska man göra såhär:
<?php
ett();
tva();
tre();
?>
Att gå in i och lämna PHP-miljön i en fil tar tid.

3. Bilder, CSS och eventuella JavaScript inkluderas på klientsidan så där spelar det ingen roll vilken server dessa ligger på, du får bara ange hela URLen till bilden eller vad det är i din HTML.

Att köra script på andra sidor går bra om du anropar dom via HTTP, så du anropar dom helt enkelt som om det vore en sida på en annan server. Lastbalanserare löser inte alltid allt, en lastbalanserare kan bara lösa vissa problem.

Om du försöker optimera kod på det här sättet och känner att du måste få den att gå snabbare eller så så känns det som att du har andra fel i koden.

Jag själv skulle aldrig lägga ut delar av PHP på andra servrar, du tappar för mycket då, ha istället en separat databasserver den dag du kommer upp i det besökarantal att du behöver det och lägg in saker som bara ska göras mot databasen i stored procedures i denna så att du slipper hämta saker för att stoppa in nya saker (exempelvis hämta id i tabell A för en grej med namnet x för att sen stoppa in det i tabell B, då gör du en stored procedure som får x och allt som ska in i B och slår upp rätt id i A). Satt senast i veckan och knackade stored procedures, underbart om man kan hantera det och hittar saker man kan flytta dit för det minskar ju delvis belastningen på webservern även om båda servrarna kör på samma fysiska maskin.

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor

Permalänk
Medlem

Generellt sett så behöver du inte bry dig om att optimera PHP-kod. Det är ofta större designbeslut som spelar roll, inte mikrooptimeringar. Se till exempel svaren på den här SO-frågan.

Permalänk
Medlem

Använd inte databasen mer än nödvändigt och att se till att du använder index på rätt fält. Försök att använda cache så mycket som möjligt, även i webbläsaren. Jag tror det gör mest skillnad för besökaren.
PHP-delen skulle jag bara försöka hålla lättläst med bra variabelnamn så man förstår koden senare.

Permalänk
Medlem

Man behöver ju inte använda interpretator utan man kan ju kompilera koden innan runtime (antingen först transformera den till ett annat språk och kompilera eller direkt till något Intermediate språk).
Mer info: PHP#Compilers - Wikipedia

Visa signatur

citera!

Permalänk
Medlem

Funktioner är helt meningslösa om de inte returnerar ett värde eller tar parametrar, används mer än en gång på en sida eller är del av en klass. I ditt exempel behöver du fortfarande inkludera filen som innehåller meny-funktionen. Därefter behöver du göra ett anrop till funktionen, vilket är slöare än att bara inkludera en fil och låta klienten parsa den resulterande HTML-en.

Visa signatur

Kom-pa-TI-bilitet