Inget applikationsbegrepp i PHP? Ingen global cache?

Permalänk
Medlem

Inget applikationsbegrepp i PHP? Ingen global cache?

Hej,

Normalt utvecklar jag i java, och eftersom världen av idag är rätt www-fokuserad så blir det mycket jsp/servlets/velocity. Då och då har jag funderat lite på att prova på PHP som lite omväxling, men det har aldrig riktigt blivit av. Förrän nu...

Men det tog inte många timmar innan jag råkade på vad jag ser som en uppenbar brist i PHP. Jag tänkte mig nämligen att jag skulle vilja ha en egen liten konfigureringsfil eller vad man nu ska kalla det, placerad utanför den publika html-mappen (dvs filen är inte "surfbar"). Sen läser jag in filens innehåll med PHP-kod, och gör viss stränghantering (t.ex "tokaniserar" raderna). Detta gick utan problem. Men givetvis känns det inte rätt att behöva läsa denna fil varje gång någon surfar in på sidan i fråga, så jag ville spara undan mitt data på något lämpligt sätt, men det gick inte så bra. Hur mycket jag än letade runt hittade jag ingenting, förutom andra som var lika förvirrade som jag är nu, och som mest fick negativa svar på sina frågor.

Själv är jag ju van från servlets-världen att man har tillgång till ett "application scope", där man kan spara undan valfria objekt, som sen är tillgängliga för alla sidor inom samma applikation/webapp oavsett sessioner och liknande.

Jag gissar att jag kommer få lika negativa svar här, men jag frågar ändå: Finns det inget enkelt och vedertaget sätt att spara undan data i minnet, så att alla PHP-sidor kan komma åt det oavsett session?

Är det bara jag som tycker att detta är en stor brist i PHP? Eller är typiska PHP-siter designade på så sätt att denna form av cache inte behövs? Jag menar, visst, man kan självklart låta varje enskilt request orsaka en läsning av filen, eller ett antal anrop till en databas, men hur effektivt är det på en skala? Och hur väl klarar ett sånt system en rejäl anstormning av besökare? Jag minns ett projekt för några år sedan där vi hade missat att slå på vissa cachar, vilket ledde till att systemet gick på knäna även vid måttligt besökarantal, och antalet databasanrop var på tok för många (varje sid-request triggade typ ett 50-tal requests mot databasen om jag minns rätt). När vi slagit på rätt cache så föll databasanropen till ett minimum och siten tuffade på utan minsta ansträngning.

Hur överlever alla stora siter utan denna form av cache? T.ex facebook och wikipedia. Satsar dom stenhårt på ett cache-lager längre ut (hela html-sidor)?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jimih
Hej,

Normalt utvecklar jag i java, och eftersom världen av idag är rätt www-fokuserad så blir det mycket jsp/servlets/velocity. Då och då har jag funderat lite på att prova på PHP som lite omväxling, men det har aldrig riktigt blivit av. Förrän nu...

Men det tog inte många timmar innan jag råkade på vad jag ser som en uppenbar brist i PHP. Jag tänkte mig nämligen att jag skulle vilja ha en egen liten konfigureringsfil eller vad man nu ska kalla det, placerad utanför den publika html-mappen (dvs filen är inte "surfbar"). Sen läser jag in filens innehåll med PHP-kod, och gör viss stränghantering (t.ex "tokaniserar" raderna). Detta gick utan problem. Men givetvis känns det inte rätt att behöva läsa denna fil varje gång någon surfar in på sidan i fråga, så jag ville spara undan mitt data på något lämpligt sätt, men det gick inte så bra. Hur mycket jag än letade runt hittade jag ingenting, förutom andra som var lika förvirrade som jag är nu, och som mest fick negativa svar på sina frågor.

Själv är jag ju van från servlets-världen att man har tillgång till ett "application scope", där man kan spara undan valfria objekt, som sen är tillgängliga för alla sidor inom samma applikation/webapp oavsett sessioner och liknande.

Jag gissar att jag kommer få lika negativa svar här, men jag frågar ändå: Finns det inget enkelt och vedertaget sätt att spara undan data i minnet, så att alla PHP-sidor kan komma åt det oavsett session?

Är det bara jag som tycker att detta är en stor brist i PHP? Eller är typiska PHP-siter designade på så sätt att denna form av cache inte behövs? Jag menar, visst, man kan självklart låta varje enskilt request orsaka en läsning av filen, eller ett antal anrop till en databas, men hur effektivt är det på en skala? Och hur väl klarar ett sånt system en rejäl anstormning av besökare? Jag minns ett projekt för några år sedan där vi hade missat att slå på vissa cachar, vilket ledde till att systemet gick på knäna även vid måttligt besökarantal, och antalet databasanrop var på tok för många (varje sid-request triggade typ ett 50-tal requests mot databasen om jag minns rätt). När vi slagit på rätt cache så föll databasanropen till ett minimum och siten tuffade på utan minsta ansträngning.

Hur överlever alla stora siter utan denna form av cache? T.ex facebook och wikipedia. Satsar dom stenhårt på ett cache-lager längre ut (hela html-sidor)?

Pekar detta dig åt rätt håll?
http://meta.wikimedia.org/wiki/PHP_caching_and_optimization

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Förutom APC finns även memcache.

Permalänk
Medlem

En annan möjlighet är att inte ändra på ditt script något alls utan helt enkelt lägga den filen som du hämtar datan ifrån i minnet. Detta har väl egentligen inte så mycket med php att göra men det kan kanske ändå vara en lösning för dig och vara väl värt att nämna.

tmpfs heter filsystemet som du behöver använda och en guide finns här:
http://www.howtoforge.com/storing-files-directories-in-memory...

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Leedow
Pekar detta dig åt rätt håll?
http://meta.wikimedia.org/wiki/PHP_caching_and_optimization

Citat:

Ursprungligen inskrivet av bjornie
Förutom APC finns även memcache.

Tackar Leedow och bjornie för dessa länkar.
Men då kommer min följdfråga: för mindre siter, liggandes på webhotell, brukar såna tillägg vara tillgängliga? Eller skulle det innebära att användarna kan komma åt de andras cache-objekt?

Citat:

Ursprungligen inskrivet av Nasso
En annan möjlighet är att inte ändra på ditt script något alls utan helt enkelt lägga den filen som du hämtar datan ifrån i minnet. Detta har väl egentligen inte så mycket med php att göra men det kan kanske ändå vara en lösning för dig och vara väl värt att nämna.

tmpfs heter filsystemet som du behöver använda och en guide finns här:
http://www.howtoforge.com/storing-files-directories-in-memory...

Jo, visserligen, men det innebär ju ändå att man måste "parsa" filens innehåll för varje request, något som känns extremt onödigt om filen uppdateras kanske en gång i veckan.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jimih
Tackar Leedow och bjornie för dessa länkar.
Men då kommer min följdfråga: för mindre siter, liggandes på webhotell, brukar såna tillägg vara tillgängliga? Eller skulle det innebära att användarna kan komma åt de andras cache-objekt?

Jag kan inte svara för APC, men memcache brukar inte vara tillgängligt för att man delar minnesrymden mellan hotellts kunder - d.v.s. att man i så fall kan komma åt andra sidors objekt. Jag skulle dock gissa på att APC inte finns tillgängligt heller, då det inte ens har kommit någon stable-version ännu. Det kommer däremot att finnas med i PHP6.

Permalänk
Medlem

Ytterligare två sätt är att använda SQLite och Zend_Cache, större chans att dessa två fungerar på webhotell. Det är ju dock inte i närheten av att kallas för application scope store... Däremot kan det ju fungera.

Permalänk

Måste bara lägga in lite information om Wikipedia och Facebook... Facebook använder enbart PHP som template-språk, så för datahantering och liknande används Java/C++. Samma sak hos Wikipedia, men där används mycket caching och Mono-plattformen med C#.

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av hagbarddenstore
Måste bara lägga in lite information om Wikipedia och Facebook... Facebook använder enbart PHP som template-språk, så för datahantering och liknande används Java/C++. Samma sak hos Wikipedia, men där används mycket caching och Mono-plattformen med C#.

Sakta i backarna. Wikipedia använder fortfarande en modifierad version av MediaWiki, vilket är helt och hållet skrivet i PHP (med MySQL som databas).
Sen används dock saker som Memcached, Squid och Lucene för cachning och sökning.

Vad Facebook använder har jag ingen aning om. Däremot vet jag att det är bland annat Erlang (var i alla fall prat om det) och C++ (vill jag minnas att jag läst).

Källor:
http://en.wikipedia.org/wiki/Wikipedia:About
http://en.wikipedia.org/wiki/Wikipedia#Software_and_hardware
http://www.nedworks.org/~mark/presentations/san/Wikimedia%20a...

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jimih
Jo, visserligen, men det innebär ju ändå att man måste "parsa" filens innehåll för varje request, något som känns extremt onödigt om filen uppdateras kanske en gång i veckan.

Spara en variabel i varje fil. Döp filen till variabelns namn och spara variabelns värde i filen. Då behöver du inte parsa något. Blir som att hämta en variabel. Använd get_file_contents() för enkelhetens skull.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Nasso
Spara en variabel i varje fil. Döp filen till variabelns namn och spara variabelns värde i filen. Då behöver du inte parsa något. Blir som att hämta en variabel. Använd get_file_contents() för enkelhetens skull.

Gisses!

Lägg skiten i shared memory, case closed.
Har man skalningsproblem så ligger man inte kvar på en shared host utan har egan burkar och då försvinner majoriteten av dessa säkerhetsproblemen.
Man kan även skapa PHP-filerna med arrayen i PHP-filen. Då behövs varken filinläsning, parning eller anant skit och PHP-acceleratorerna kommer då ha en cachad komplett fil i minnet.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Nasso
Spara en variabel i varje fil. Döp filen till variabelns namn och spara variabelns värde i filen. Då behöver du inte parsa något. Blir som att hämta en variabel.

Men jag tänkte mig än mer komplicerad struktur än en enkel variabel. Säg t.ex en samling produkter. Dessa kommer givetvis från en databas, men om de inte uppdateras ofta så är det bara dumt att hämta dom från databasen igen vid varje http-anrop.

Jag såg att det fanns en funktion för serialisering, men kan inte det vara en kostsam operation även det? Dessutom känns det principiellt fel att hålla på med dessa enligt mig krystade workarounds för att lösa problemet.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av iXam
Gisses!

Lägg skiten i shared memory, case closed.
Har man skalningsproblem så ligger man inte kvar på en shared host utan har egan burkar och då försvinner majoriteten av dessa säkerhetsproblemen.

Men det känns lite märkligt att det krävs egna burkar för att få till en så enligt mig fundamental sak som vanlig icke-sessions-baserad cachning.

Citat:

Man kan även skapa PHP-filerna med arrayen i PHP-filen. Då behövs varken filinläsning, parning eller anant skit och PHP-acceleratorerna kommer då ha en cachad komplett fil i minnet.

Nu hängde jag inte riktigt med, har du lust att utveckla detta? Säg att jag hämtat en massa data från databasen och vill slippa hämta det igen för nästa http-anrop, kan jag då lösa det problemet med det du pratar om här?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av jimih
Men det känns lite märkligt att det krävs egna burkar för att få till en så enligt mig fundamental sak som vanlig icke-sessions-baserad cachning.

Nu hängde jag inte riktigt med, har du lust att utveckla detta? Säg att jag hämtat en massa data från databasen och vill slippa hämta det igen för nästa http-anrop, kan jag då lösa det problemet med det du pratar om här?

Du har ett script som då och då skapar exempelvis en PHP-fil som kan inkluderas från andra script. Då kommer PHP-acceleratorn känna av när filen ändras och endast parsa och cacha om den då.

Den genererade filen ska ha en arraystruktur skapad för det du vill. En produktdatabas blir mao :

<?php $prodDB = array( array('namn' => ''Skjorta grön'. 'pris' => '100' ), array('namn' => ''Skjorta röd'. 'pris' => '101' ), array('namn' => ''Skjorta transparant'. 'pris' => '0' ) ); ?>

Denna filen kör man include på.

Ja, jag håller med om att det är knasigt att det inte finns något riktigt vettigt sätt för PHP. Jag skulle dock vilja skylla detta på att PHP körs via Apache som i sin tur begränsar detta.

Skulle man skriva en applikationsserver för PHP skulle det bli kickass.
Då skulle man kunna ha bakgrundsprocesser som startas via scripts som blir kallad på via HTTP, man skull ekunna ha globala variabler/strukturer och dessutom kunna ge dessa scopes via ACL osv.