WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Bästa sätt att cacha sidor? (https://www.wn.se/forum/showthread.php?t=7034)

Micke04 2005-03-30 09:48

Jag undrar om det finns några smarta sätt att serva php sidor med otroligt många sql anrop på ett statiskt sätt. Alltså jag tänkte att man uppdaterar en statisk sida varje minut med aktuell sql information genom en cron av något slag.

Vad jag vill uppnå är att klara av en mycket hög peaknivå på samtidia besökare utan att servern dör..



Några förslag ?

Jawn 2005-03-30 10:47

Detta är en viktig fråga jag undrar över också.

tino 2005-03-30 11:22

http://smarty.php.net/

kers 2005-03-30 11:23

En enkel lösning om man vill minska belastningen på sql-anropen är att köra squid lokalt på servern (du kör alltså en proxy lokalt som refreshar sin cache efter X sekunder).

Annars så kan man generellt snabba upp phpscript otroligt genom att använda chachning av php direkt, via mod_php, Zend cache eller Php-accelerator - men för att minska loaden på databasen så måste du då börja hacka om dina script.

Micke04 2005-03-30 12:01

Citat:

Originally posted by kers@Mar 30 2005, 10:23
En enkel lösning om man vill minska belastningen på sql-anropen är att köra squid lokalt på servern (du kör alltså en proxy lokalt som refreshar sin cache efter X sekunder).

Annars så kan man generellt snabba upp phpscript otroligt genom att använda chachning av php direkt, via mod_php, Zend cache eller Php-accelerator - men för att minska loaden på databasen så måste du då börja hacka om dina script.

Jag tittade på squid men det verkar vara ett rätt avancerat program...

Rekommenderas squid eller är det väldigt ambitiöst ? Jag vet inte om vi kommer att behöva en cache på vår nya sajt men vi vill klara av stora peaks om det nu skulle komma en oväntat stor våg med besökare..



Smarty verkar ju inte vara helt fel!

grazzy 2005-03-30 13:16

Ett enklare och ofta bättre sätt är att använda phps buffer och själv lagra det man skriver ut till användaren till en fil genom att använda output buffern.

Se http://se2.php.net/manual/en/function.ob-g...et-contents.php - när man sparat innehållet i denna är det sedan en smal sak att använda mod_rewrite för att skicka filen istället för en dynamisk kopia. Ta bort de statiska filerna med ett cronjob när de blivit äldre än "xx" minuter med find.
Kod:

rm -f `find <sökväg till filer> -cmin +XX`

Micke04 2005-03-30 13:23

Citat:

Originally posted by grazzy@Mar 30 2005, 12:16
Ett enklare och ofta bättre sätt är att använda phps buffer och själv lagra det man skriver ut till användaren till en fil genom att använda output buffern.
Se http://se2.php.net/manual/en/function.ob-g...et-contents.php - när man sparat innehållet i denna är det sedan en smal sak att använda mod_rewrite för att skicka filen istället för en dynamisk kopia. Ta bort de statiska filerna med ett cronjob när de blivit äldre än xx minuter med find.
Kod:

rm -f `find sökväg till filer -cmin +XX`

Ah där har vi nog det jag egentligen letade efter. Jag tycker dock att smarty verkar vara ett smart sätt att bygga sajten på så jag har bett programmeraren att titta på det.

digiArt 2005-03-30 13:31

Eller så går man över till .NET så finns det inbyggt, kräver endast en rad kod. :D

Micke04 2005-03-30 14:17

Citat:

Originally posted by digiArt@Mar 30 2005, 12:31
Eller så går man över till .NET så finns det inbyggt, kräver endast en rad kod. :D

Ja när vi fått lite rullning på våra affärer kanske vi har råd med licenser osv.. men jag har inte sett många bra asp .net sidor, kan du ge några exempel ?

Robert 2005-03-30 14:27

Citat:

Ursprungligen postat av Micke04
Citat:

Ursprungligen postat av digiArt
Eller så går man över till .NET så finns det inbyggt, kräver endast en rad kod. :D

Ja när vi fått lite rullning på våra affärer kanske vi har råd med licenser osv.. men jag har inte sett många bra asp .net sidor, kan du ge några exempel ?

Hur menar du? "Bra" utifrån det som "syns" är väl inte direkt beroende av serverteknologi, så det finns både bra och dåliga siter gjorda med diverse tekniker (som ju det mesta beror på vad som sitter bakom spakarna) =)

Mycket av det som är bra är det som egentligen inte syns, nämligen snabb utvecklingstakt, serverprestanda (kompilerad kod + flera nivåer av cachning etc) och objektorientering (för den som vill det) och "allt-i-samma-paket" (den som lär sig hela .Net's objektbibliotek med klasser och metodnamn utantill ska få ett pris av mig!) :)

hnn 2005-03-30 14:36

Citat:

Ursprungligen postat av Micke04
Citat:

Ursprungligen postat av digiArt
Eller så går man över till .NET så finns det inbyggt, kräver endast en rad kod. :D

Ja när vi fått lite rullning på våra affärer kanske vi har råd med licenser osv.. men jag har inte sett många bra asp .net sidor, kan du ge några exempel ?

Vårt egna lilla Luderstorm är omskrivet i .NET....


Ser dock ingen större skillnad på snabbhet osv....

kullervo 2005-03-30 15:28

Att hålla på med proxy och grejer låter som mycket arbete och ändå inte som permanent lösning. Jag skulle välja att skiva effektivare kod framför proxy alla dagar. Här följer två snabbåtgärder som borde vara enkelt fixat:

1. Som Grazzy sa att låta PHP-koden lagra statiska sidor. PHP's inbyggda buffer gör som sagt livet enkelt. Använd crontab efter behag.

2. Slå på cache i SQL-servern. I mysql heter det så enkelt som query cache och aktiveras i my.cnf med raden "query_cache_size = <storlek>MB".

Jawn 2005-03-30 20:57

Vad kan ni rekommendera för mig som kör en toplista som hämtar mycket information för varje besökare från databasen hela tiden?

grazzy's idé ?

Qo-naq 2005-03-31 01:02

Citat:

Ursprungligen postat av hnn
Citat:

Originally posted by -Micke04@Mar 30 2005, 14:17
Citat:

Ursprungligen postat av digiArt
Eller så går man över till .NET så finns det inbyggt, kräver endast en rad kod. :D

Ja när vi fått lite rullning på våra affärer kanske vi har råd med licenser osv.. men jag har inte sett många bra asp .net sidor, kan du ge några exempel ?


Vårt egna lilla Luderstorm är omskrivet i .NET...

Playahead är programmerat i ASP.NET och är riktigt snabb.

ZN 2005-03-31 22:34

PHP-Acc är instabil, testa http://turck-mmcache.sourceforge.net, mycket bra och stabil, och som nämnts tidigare, försök få så många querys som möjligt att cachas, kolla så att dom använder index, tabelltyper, innodb kanske gör susen på vissa tabeller genom att frigöra locks osv...finns massor man kan göra.

hnn 2005-03-31 23:28

Citat:

Originally posted by Bitbull@Mar 31 2005, 22:34
PHP-Acc är instabil, testa http://turck-mmcache.sourceforge.net, mycket bra och stabil, och som nämnts tidigare, försök få så många querys som möjligt att cachas, kolla så att dom använder index, tabelltyper, innodb kanske gör susen på vissa tabeller genom att frigöra locks osv...finns massor man kan göra.
PHP-Acc är TURCK MM-Cache ;)

MMCache är nerlagt och PHP-Acc är fortsättningen på koden....

Crotalus 2005-04-01 00:25

Citat:

Ursprungligen postat av hnn
Citat:

Ursprungligen postat av Bitbull
PHP-Acc är instabil, testa http://turck-mmcache.sourceforge.net, mycket bra och stabil, och som nämnts tidigare, försök få så många querys som möjligt att cachas, kolla så att dom använder index, tabelltyper, innodb kanske gör susen på vissa tabeller genom att frigöra locks osv...finns massor man kan göra.

PHP-Acc är TURCK MM-Cache ;)

MMCache är nerlagt och PHP-Acc är fortsättningen på koden....

eAccelerator (http://eaccelerator.net/) är en fortsättning på turck-mmcache.

Både php-accelerator och turck-mmcache är "döda" projekt.

matlin 2005-04-14 00:54

Jag gillar inte smarty ... även fast den cachar, varför inte använda vyer på databas-sidan?

grazzy 2005-04-14 11:22

Som en vän häromdagen påpekade så kan man även serialisera objekt till disken i PHP. Det kan vara praktiskt om man har lite overhead på att skapa objekten.
Se http://se.php.net/serialize och http://se.php.net/unserialize


Här är kod för att cachelagra filer i php.
Kod:

    ob_start(); # startar output buffering
    ob_implicit_flush(0); # stänger av automatisk flush

    /* rss_output är en hemmagjord funktion som skriver ut en rss-feed
    * från ett mysql-result. Den skriver till vanliga stdout/skärmen.
    */
    rss_output($result);
    $contents = ob_get_contents(); #spara buffern i $contents
    ob_end_clean(); #rensar buffern och slår på automatisk flush

    # skriver ner filen till $rss_filename som är ett unikt filnamn baserat på alla statevariablar
    # sorteringsordning, sökord, kriterier etc.
    $fh = fopen($rss_filename,"w");
    fwrite($fh,$contents,strlen($contents));
    fclose($fh);

    # spotta ut innehållet på skärmen (annar visas inte datan första gången man kör)
    echo $contents;

För att sedan använda sig av den cache-lagrade filen är det bara att titta om den finns.
Kod:

if (file_exists($rss_filename)) {
        Header("Content-Type: application/xml"); # spotta ut en header (specifikt för xml/rss)
        echo file_get_contents($rss_filename); # läs in och skriv ut filen
        die(); # lite fulhack, men sånt är livet :)
}

För att göra livet enkelt för mig har jag valt att inte läsa timestamps osv i mina script, utan det sköts istället via ett crontabjob som med följande rader tar bort alla filer som är äldre än 14 minuter:
rm -f \`find *.xml -cmin +14`

chrizz 2005-04-14 12:35

Turck mmcache använder jag också, fungerar mycket bra.

Som nämnts tidigare kan man göra väldigt mycket i mysql-inställningarna (antar att du kör mysql?). I min debian-dist finns en rad exempelkonfigurationer som baseras på hur mycket minne datorn har. Jag har modifierat lite och har ställt in så här för myisam-tabeller (1gb minne):

key_buffer = 512M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 4M
read_buffer_size = 4M
myisam_sort_buffer_size = 128M
thread_cache = 8
query_cache_size = 64M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 2

Vet inte om det hjälper dig något, men det ger en hint iaf. Det som är default i mysql är vad jag sett anpassat för väldigt lite minne.

query_cache_size kan vara mycket större om dina tabeller är hyfsat statiska. Uppdateras dem ständigt så nollställs all cache för den tabellen.

grazzy 2005-04-14 12:55

Ett gott råd är dock att alltid spara sina befintliga inställningar innan man börjar pilla med MySQLs defaultvärden.

SkyNet 2005-04-21 12:31

Jag skulle hellre slå ett slag för eAccelerator, som är en vidareutveckling av Turck MMCache (den utvecklas ju inte längre). Finns på http://eaccelerator.sourceforge.net. Fick inte MMCache att fungera ihop med PHP 4.3.11, så det fick bli eAccelerator istället. Samma upplägg (installera som zend_extension) och samma options som i MMCache, fast mindre buggar.

kullervo 2005-04-21 16:45

Citat:

Originally posted by SkyNet@Apr 21 2005, 11:31
Jag skulle hellre slå ett slag för eAccelerator, som är en vidareutveckling av Turck MMCache (den utvecklas ju inte längre). Finns på http://eaccelerator.sourceforge.net. Fick inte MMCache att fungera ihop med PHP 4.3.11, så det fick bli eAccelerator istället. Samma upplägg (installera som zend_extension) och samma options som i MMCache, fast mindre buggar.
Jag kan också intyga att Turck MMCache fungerar mycket bra, men jag kör den med 4.3.11 utan problem.

Ett tips angående inställningar av MySQL: Använd Mysql Administrator (www.mysql.com). Där kan man se minnes-status och enkelt utläsa vad man har för flaskhalsar. Det enda jag saknar är möjligheten att se vilka frågor som inte använder sig av index fullt ut.

Just nu för stunden snittar min MySQL 4.1 på 23 frågor per sekund och Query Cache hitrate ligger på hela 92% och använder bara 2MB minne(!!!). Key Efficiency ligger på 99%. Belasningen är 2 communities.

SkyNet 2005-04-22 13:05

Citat:

Originally posted by kullervo@Apr 21 2005, 15:45
Just nu för stunden snittar min MySQL 4.1 på 23 frågor per sekund och Query Cache hitrate ligger på hela 92% och använder bara 2MB minne(!!!). Key Efficiency ligger på 99%. Belasningen är 2 communities.
Hur mycket Query Cachen ligger på beror ju mångt och mycket på hur pass ofta informationen förändras på sajten. Själv ligger jag på ca 20%, men jag har mycket inserts också. Snittar ung 260 queries/sek just nu. Håller på och kollar om exempelvis JPCache kan hjälpa lite.


Alla tider är GMT +2. Klockan är nu 13:52.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson