ugrás a tartalomhoz

Session vagy SQL lekérdezés?

T.Zoli · 2008. Már. 2. (V), 20.58
Üdv :)

Egy bizonyos oldalnál 8-10 adatot kell minden egyes oldalletöltésnél feltölteni adatbázisból. Az adatok több különböző táblában találhatóak és csak ritkán változnak.

Két megoldás lebeg a szemeim előtt:

Egyik esetben minden oldalletöltésnél csinálok egy összetett lekérdezést (MySQL), a kapott adatokat pedig kipakolom változókba.

A másik esetben session változókba teszem őket (ha még nem léteztek) és ezekkel dolgozom a továbbiakban.
Így elkerülöm a folyamatos lekérdezéseket, és csak arra kell figyelnem, ha változás történik az adatokban, akkor aktualizáljam a változást az adatbázisban is (ez ugye fennáll az első esetben is).

Arra lennék kíváncsi, melyik a gyorsabb megoldás, melyik terheli kevésbé a szervert?

Zoli
 
1

Honnan tudom, változik e-?

szaky · 2008. Már. 2. (V), 21.49
A sessionhoz való hozzáférés gyorsabb, mint egy (pláne összetett) sql lekérés.
3

Azt majd én figyelem :)

T.Zoli · 2008. Már. 2. (V), 22.46
Ha a user olyasmit cselekszik, ami megváltoztatja ezen adatok bármelyikét, akkor aktualizálom a változást.

Igazából az érdekelt, hogy pakolhatom-e nyugodtan a session változóba az adatokat, rendszeres sql lekérdezés helyett.
Nekem így egyszerűbb lenne, az tény, meg ezekszerint a szervernek sem mindegy, hogy mivel tölti az ideje jórészét.
4

Akkor Jó :)

szaky · 2008. Már. 3. (H), 09.25
Tehát ha az adatbázis nem változhat az aktuális munkamenettől függetlenül, akkor király vagy: ha nincs sessionban a megfelelő adat, akkor adatbázisból betöltöd, és mikor változtatod (feltéve, hogy ez a változtatás ritka) visszaírod adatbázisba: ez szignifikánsan hatékonyabb megoldás.
5

kliens oldal

zzrek · 2008. Már. 3. (H), 10.08
Van még más lehetőség is, "ha az adatbázis nem változhat az aktuális munkamenettől függetlenül". Ekkor a leggyorsabb, ha a kliens oldalon tartod az adatokat (js változókban) és nem frissíted be az oldalt (vagyis AJAXozol). Ekkor semmi fölösleges forgalom nincs a szerver felé, a szervernek még a session változókat sem kell kezelnie. Ha az adatok megváltoztak, elküldöd a szervernek lementeni.
2

session gyorsabb.

solkprog · 2008. Már. 2. (V), 22.10
Hello.

session (szerintem) is gyorsabb (ebben az esetben)
Viszont csatlakoznék "szaky" kérdéséhez. Az engem is érdekelne hogy azt honnan fogod tudni hogy friss-e az az adat?
Javasolnék egy "alternatív" megoldást. Csak akkor fordulsz az adatbázisból ha az sessionban lévő adat mondjuk régebbi 5 percnél. Persze ha nem baj hogy (néhány) felhasználó x percig nem a legfrissebb adatot látja.
6

félmegoldás

Szekeres Gergő · 2008. Már. 3. (H), 10.16
pl egy névváltozásnál hülyén néz ki ha egy darabig a régi marad kint. onnan lehet tudni amúgy, hogy amikor az adott adatot frissítené adatbázisban, akkor sessinban is átírja. (így egyáltalán nem kell lekérdezni, hisz az updateben lévő request változót csak beleírod a sessionbe).
7

admin session != user session

zila · 2008. Már. 3. (H), 11.38
Az admin sessionje természetesen nem ugyanaz mint a látogató sessionje, így ez nem járható út... Én eltárolnék egy hash-t is a táblához (vagy egy timestamp-et a módosítás időpecsétjével) ezt a hash-t lekérdezném mindig, ha nem egyezik a sessionben lévővel, akkor lekérdezném az adatokat a db-ből és frissíteném a session-t.
9

mégis miért nem?

Szekeres Gergő · 2008. Már. 3. (H), 15.14
egy hash lekérése is időbe telik, ráadásul ha nincs egyezés egy újabb queryvel tudod lekérdezni az adatokat..
10

Hajjaj

zila · 2008. Már. 3. (H), 15.51
Egy táblából egy indexelt érték lekérése icipicit gyorsabb mint egy több táblás lekérdezés.
Csak akkor kell lekérdezni, ha a hash nem stimmel, ha stimmel akkor jön sessionből az adathalmaz.

Sessionökről:
Az admin user belép létrejön neki egy session, elvégzi a módosításokat a táblákon, elrakod sessionbe az új értékeket, de amit ebbe a sessionbe pakolsz az nem fog látszódni a siteon egyébként jelenlévő felhasználók sessionjében, mivel minden felhasználónak saját különbejáratú sessionje van. Hogyan értesíted a módszereddel a többi felhasználót, hogy megváltoztak az adatok?

Az igazi megoldás egy általános cache építés/használat ekkor ha egy felhasználó lekér valamit, amit cache-ben van azt nem kell adatbázisból leszedni újra, függetlenül attól, hogy ő kérte le vagy más. De ezt már mondták előttem.
8

cache

gex · 2008. Már. 3. (H), 13.02
jó sok dolgot olvastam itt, de neked igazából cache-re van szükséged. meg tudod nézni, hogy nagyobb rendszerekben hogyan oldják meg, de az alapja igazából annyi, hogy
1. megnézed van-e cache fájl és érvényes-e még
2. ha van, kiírod a cache fájlt
3. ha nincs, akkor jön a lekérdezés, legenerálod az oldalt, elmented cachefájlba és ki is írod
ennyi leegyszerűsítve.
úgy kell elképzelni, mintha mindig html fájlokat (egész oldalakat, vagy csak részeket) generálnál azzal a kiegészítéssel, hogy ezeket időnként érvénytelenné nyilvánítod (pl ha változik az adat a db-ben, akkor törlöd a cache-t, vagy a fájl létrehozása utáni bizonyos idő eltelte után újragenerálod).

a php fejlesztés felsőfokon c könyvben van egy egész fejezet erről, én azt hasznosnak találtam.
11

Session nyerésre áll

T.Zoli · 2008. Már. 3. (H), 19.30
Köszönöm az eddigieket. Cache-nek nem látom sok értelmét, mert user specifikus adatokról van szó.
Vagy nem gáz, ha nekiállok cache-elgetni 8-10 változó tartalmát, userenként?

Session működéséhez, mert kíváncsi vagyok:

Mikor és hogyan olvassa be a szerializált adatokat a session fájlból a php?
- mikor először használom valamelyik session változót, csak akkor, és csak azt
- vagy mikor először használom valamelyiket, beolvassa mindet
- vagy rögtön a script futásának kezdetén mindet?

Ugyanez érdekelne abban az esetben is, mikor értékváltozásra/írásra kerül a sor.
12

manual

zila · 2008. Már. 3. (H), 20.03
Mielőtt itt nagyon belemerülnénk:
http://hu.php.net/session
13

session+hash ellenőrizés javaslok

solkprog · 2008. Már. 3. (H), 20.10
Kezdhetted volna azzal hogy user specifikus adatokról van szó. (így fel tudjuk mérni az adatmennyiséget: 8-10 x néhány szó/esetleg mondat [én más mennyiségre gondoltam előszőr])

Vagy nagyon szépen ügyesen oldod meg a cache vagy tényleg használj session-t és ellenőrizd hogy hash alapján hogy friss-e. (vagy az x perces módszerrel :) )

Mint "zila" írta itt 10 hozzászolásában hogy az nem fog müködni hogy ahogy megváltozik az adatbázisban valami akkor te átírod a session-t. Mert felhasználóra kiterjedő session-ok vannak, és nem mindenkire érvényessek!