Vinnaren i pepparkakshustävlingen!
2018-09-20, 18:21
  #1
Medlem
lasternassummas avatar
Mät prestanda med PHP
Stimulerad av en annan tråd om en långsam webbserver skapar jag denna om prestandamätning med PHP.

Innan jag går in på PHP vill jag påminna om en del av vad som sker mellan att man trycker på en länk eller skriver in en URL och att resultatet till fullo har presenteras i ett browserfönster.

1. En http-förfrågan ska skickas från din enhet till aktuell server.
2. Denna request har ett namn som måste upplösas till en ip-adress av DNS-systemet (i den lokala enheten och på internet).
3. Förfrågan skickas nu genom ett antal routrar och kommer (förhoppningsvis) fram till servern.
4. Servern ska tolka denna request och därigenom avgöra vad som ska skickas tillbaka.
5. Servern bygger en sida som skickas och som oftast avslutas med </html>.
6. Svaret ska passera genom routrar på vägen tillbaka.
7. När svaret kommer tillbaka ska det tolkas (t.ex. HTML och CSS) och exekveras (JavaScript).
8. Resultatet blir en sida som presenteras i ett browserfönster på skärmen.

Om detta tar lång tid så kan det ha många orsaker.
Den egna utrustningen och internetförbindelsen kan vara långsamma.
För att avgränsa lite bland övriga orsaker kan man (jag tar exempel från Linux/Mac, men det finns motsvarande program i Windows).
– Köra "dig" för att se hur bra DNS-systemet svarar. T.ex.
Kod:
dig www.sunet.se
– Köra ping för att se hur lång tid det tar för ett litet paket att komma fram och för svaret att komma tillbaka. T.ex.
Kod:
ping www.sunet.se
– Köra traceroute för att se om det finns några flaskhalsar på vägen. T.ex.
Kod:
traceroute www.sunet.se
Traceroute kör UDP som default, vilket hanteras dåligt av ett växande antal routrar. Då kan det vara bättre att köra ICMP ECHO i stället:
Kod:
traceroute -I www.sunet.se

Om någon av testerna ovan ger ett dåligt resultat så måste det åtgärdas separat.
Om allt ovan ger hyggligt resultat, men svarstiden ändå är lång, då kan det vara dags att titta på om servern är långsam.

I nästa post ska jag beskriva hur jag enkelt gjort det med PHP.

Citera
2018-09-20, 18:29
  #2
Medlem
lasternassummas avatar
Lite kod för att mäta hur en PHP-baserad webbserver presterar

This is from the main php document that produces index.php or whatever it is called.

Kod:
// Set to 1 to enable speed measurements - otherwise = 0
$myspeed = 1;

if ($myspeed>0) speed(0); // Set zero. All later measurements are from this point.

.
.
.
<head>
<meta charset=utf-8">
<?php
if ($myspeed>0)
{
$time = speed(1);
echo "<!-- timer s=" . $time[0] . " u=" . $time[1] . " -->\r";
}
?>
<title>
.
.
.

<!--
Allt som händer på sidan, mellan header och </html>, troligen inklusive:
– Databasanrop.
– Syndikaliserade annonser (som via Google som vill "kundanpassa" vilka annonser som skickas.
– Skapande av sida med hjälp av bl.a. vad som finns i databasen.
-->
.
.
.
<?php
if ($myspeed>0)
{
$time = speed(1);
echo "<!-- timer s=" . $time[0] . " u=" . $time[1] . " -->\r";
}
?>

</body>
</html>


Här är funktionen speed() som används ovan:

Kod:
// Here is the function speed that need to be reachable from index.php above.
// It can either be in it or referred to through e.g.:
// include("./addons/myfunctions.php");
// in index.php above.

function speed($spflag)
{
global $speed_s_start, $speed_m_start;
$get_time = gettimeofday();
if($spflag == 0)
	{
// Get seconds and microseconds and store in globals
	$speed_s_start=$get_time["sec"];
	$speed_m_start=intval($get_time["usec"]);
	return;
	}
	else
	{
// Get seconds and microseconds and calculate diffrence
	$speed_s=$get_time["sec"];
	$speed_m=intval($get_time["usec"]);
	$speed_diff[0] = $speed_s - $speed_s_start;
	$speed_diff[1] = $speed_m - $speed_m_start;
	if ($speed_diff[1]<0) $speed_diff[1] = $speed_diff[1] + 1000000;
	return $speed_diff;
	}
}

Notera att globala variabler används för att lagra tidinformationen.
Det här är väldigt enkelt och kan göras på många andra sätt.
Här finns inget verktyg för att analysera resultatet.
Ett sätt att se resultatet är att titta på källkoden för sidan med hjälp av webbläsaren. I slutet, strax före
Kod:
</html>
kan man se hur lång tid det tagit för servern att skapa sidan.

Om den tiden är lång (mer än ≈200 ms) så finns det anledning att gräva vidare om vad det är på servern som tar tid. Det kan man göra genom att stoppa in fler kodavsnitt som lägger ut passerad tid i HTML-koden.
Med ett långt HTML-dokument kan det vara jobbigt att leta, även om det går att söka efter den "unika" HTML-kommentaren.
Ett annat sätt att plocka fram resultatet kan vara att använda curl för att hämta sidan och sedan extrahera fram de inlagda tidsstämplarna med hjälp av ett lämpligt verktyg.

__________________
Senast redigerad av lasternassumma 2018-09-20 kl. 18:43.
Citera
2018-09-20, 20:44
  #3
Medlem
Varför inte bara använda Xdebug som har en profiler?

https://xdebug.org/docs/profiler
Citera
2018-09-20, 21:05
  #4
Medlem
lasternassummas avatar
Citat:
Ursprungligen postat av Wieslander
Varför inte bara använda Xdebug som har en profiler?

https://xdebug.org/docs/profiler

Jag har inte sett den eller testat den.

Berätta gärna lite mer!

Jag uppfattade inte från dokumentationen som du länkade till hur detaljerad information man kan få.

Kan man t.ex. mäta på vissa SQL-anrop eller JavaScript-passager (t.ex. hämta annons från Google)?

Om man t.ex. jobbar med ett CMS, som jag har mest erfarenhet av, kan man köra det kontinuerligt? Hur stora blir profiler-filerna?

Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback