Harc a cache-sel - 2. rész

img

Az első részben már nagyjából kifejtettem a koncepciót. Tehát, van egy alap file alapú cache. Kiválasztottam a tárolás formátumát, már csak néhány kérdésem maradt. Ezeket próbálom most összerakni, hogy a végén a teljes rendszert ki tudjam szolgálni cache-ből.

Második mérkőzés - mit és hogyan tároljak?

Elsőre a kérdés lehet kicsit hülyén hangzik, de megpróbálom kifejteni, min töröm a fejem. Tehát azt már tudom, hogy az adatbázis lekérdezéseket egyszerűen le tudom tárolni fileba, így az időigényesebb lekérdezések eredményét is egyszerűen adatbázis nélkül vissza tudom kérdezni.

Eddig Smarty-t használtam template rendszerként, ami nagyon sok esetben jól is jött, gyorsan lehetett összedobálni a templateket. Így a Smarty meg is oldotta helyettem a teljes template fileok letárolását, ezért nem kellett minden alkalommal újra lekérdezni az adatokat és gyorsabb lett a program.

Az egyetlen dolog, ami nagyon nem jött be a Smarty esetében, hogy ha siettem, hajlamos voltam a logikát is Smarty-ban létrehozni. Tehát lekérdeztem az adatokat adatbázisból, aztán a templateben volt egy kilométernyi if, foreach és társai. Igen, rosszul használtam, de gyorsabban haladtam. Ennek egyik hátulütője, hogy a sitebuilderek folyamatosan beszakították az oldalt. Kimaradt egy {if}, lemaradt a {/if}. A mostani projectben elég sokáig nem fog más részt venni, így jelenleg ezen sokat nem kellene aggódnom. Ebben az évben biztosan nem fogok mással, csak grafikussal együtt dolgozni. Jövőre pedig szeretném legalább 1 programozóval és 1 sitebuilderrel bővíteni a csapatot.

Tehát vissza az eredeti témához, hogyan működjön a további cachelés. A lekérdezések cachelése értelmét veszti, ha a teljes html-t letárolom egy cache fileban.

Egyáltalán van-e értelme a teljes html-t cachebe pakolni?

A jelenlegi blogmotorom pont ezt csinálja, legenerálja az oldalt, majd az eredményt kipakolja egy fileba, és "elvileg" 24 óránként frissíti a fájlokat. Azért csak "elvileg", mert ezt kellene csinálnia, de nem csinálja, mivel nem én raktam össze a programot, így ez eddig fel sem tűnt. Teszteléskor derült ki, hogy a cache file megmarad, nem 24 órára, hanem heteken keresztül. Nem frissülnek. Egy másik logikai kérdésem is felmerült a dologgal kapcsolatban.

Mi van akkor, ha egy új oldal kerül a menübe?

Ha mondjuk a cache csak 24 óránként frissül, és egy blogot hajt meg a motor, még annyira nincs is gond. De mondjuk egy webshopnál, ahol rendszeresebben van változás, már érdemesebb csak a lekérdezéseket letárolni. Így csak mondjuk kategóriánként lesz egy cache file, és nem kell a programnak létrehozni és lekezelni több ezer különböző cache-elt tartalmat, kategória oldalalakat, termék oldalakat, szöveges tartalmakat, stb stb. Tehát a cache használatának módját minden alkalommal az oldal felhasználási módja fogja meghatározni. A blogposztokat le lehet tárolni htmlben, mert egy blog ritkán frissül, egy híroldalnál, le lehet tárolni a cikkek oldalát, de a főoldalt vagy a widgeteket mindig aktuálisan kell generálni.

Miért merült fel bennem ez a kérdés?

Még túl nagy rendszereket nem feljesztettem. Vagyis van egy, aminek a havi látogatottsága 100 ezer fölött van. Ott a szerver volt a gyenge láncszem. Meghirdették az oldalt, és már az első nagyobb látogató özönnél lehalt az adatbázis. Ezen javítottam kimeneti cacheléssel. De 200 felhasználó után a szerver egyszerűen belassul, a rendszergizda pedig értetlenül áll a probléma előtt. Még úgy is, hogy az adatbázishoz csak 10 percenként nyúl a program.

Innen jött a dilemma, hogy valahogy ki kell váltanom az adatbázist, de az oldalnak "dinamikusnak" kell maradni. Sokkal könnyebb egy menüpont megváltoztatásakor 1 fájlt újragenerálni, mint az egész cachet üríteni, hogy a program újra összeállítsa minden fájlban az új menüsort. Jah persze, ez is akkor bukott ki hiányosságként a mostani blogmotoromban, mikor feltöltöttem az új tartalmat, vagy módosítottam egy tartalom kategóriáját, és az oldal egyik felében még a régi kategóriák voltak a másik felében pedig az újak. Így aztán jött a kavarodás. Ürítenem kellett a teljes cache mappát.

Tehát a végleges döntés, hogy hogyan fogom használni a cachet mindig az oldal terhelhetőségétől és a változások sűrűségétől fog függeni. Mivel a cachet kezelni tudja majd az admin felület, így gyorsan megoldható, hogy egy aktuális módosításkor már az admin törli a cache filet, ami érintett, majd újragenerálja.

Még erről a témáról tuti fogok írni, mert egyre több kérdés fogalmazódik meg bennem, ahogy egyre mélyebbre jutok a rendszerben. Le fogom írni a tapasztalataimat is, és azt, hogy mire érdemes figyelni. Jah meg pár sebességtesztet is, hogy össze lehessen hasonlítani más rendszerekkel is.