Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  7 1341
Hei,

Sitter på en utfordring hvor det er behov for å begrense antall PHP sesjoner en innlogget bruker har aktiv til enhver tid.

Tanken var ved innloging å sjekke hvor mange aktive sesjoner brukeren har, ved å sjekke sesjonsfilene på disk (der hvor timeout verdien ikke er utenfor gyldig rekke), og slette sesjonen hvis innloggingen medfører overskridning i antall sesjoner.

Tenkte å bruke samme mekanisme for å renske opp i idle sesjoner.

Men dette høres ikke ut som den beste måten å gjøre dette på i php, jeg er sikker på jeg gjør noen feil. Kan dette gjøres på en bedre og smartere måte?
Uten å kunne noe som helst om PHP, vil jeg tro de grunnleggende metodene for all programmering er noenlunde like. I så fall kan for eksempel Javascript være en løsning:

Kode

// TOTALLY NOT REAL CODE, lol.
if sessions < 10
  deny new session
else
  accept new session
Dette er som sagt kun en idé jeg har, med litt under grunnleggende erfaring innen programmeringsspråk ..
En bruker vil alltid ha en sesjon så jeg skjønner ikke hva du skal begrense..?

Om du skal begrense tiden kan du sette lagre starttidspunktet i en sesjonsvariabel og sjekke om et gitt antall sekunder er gått. Har du et tregt skript\mye loading kan du bruke session_write_close etter du har satt starttiden.
Sist endret av esl; 24. november 2012 kl. 01:58.
--Edit--
Så ikke at trådstarter skrev "på disk".

For trådstarter vil jeg heller anbefale å lagre sesjoner i en database.
I en database tabell hvor du lagrer aktive sesjoner. Hvor hver innlogging får en egen key.

Vil og anbefale at du tilbyr at man kan huske innloggingen via cookie.

Når du finner en key som eksisterer for brukeren, oppdaterer du bare sist logget på i et av feltene i samme tabell som keyen.
Når du IKKE finner en valid key OG det er maks antall sesjoner for den brukeren, fjerner du den som sist var aktiv ved å skrive f.eks
ORDER BY last_logged ASC
(tror den skal sortere etter laveste først og så stige, aka den gamleste kommer først)
og så legger du til den nye. Var det godt nok forklart?

- Molty
Sist endret av Molty; 24. november 2012 kl. 12:01.
For å vite om ei session-fil hører til en gitt bruker, kan du lagre brukernavnet i en session-variabel. Så kan du deserialisere alle session-filene og slette de som matcher brukernavnet.

Det er brute force og lite effektivt, så du bør heller legge inn en tabell i databasen med kolonner for timestamp, bruker-ID og session-ID. Da kan du spøle gjennom tabellen og slette filene <session.save_path>/sess_<session-ID> kjapt og enkelt.

PHP utfører garbage collection på session-filene, så du må håndtere at filer allerede er slettet.
MINST 12år
tore-'s Avatar
Trådstarter
Sitat av excubated Vis innlegg
Uten å kunne noe som helst om PHP, vil jeg tro de grunnleggende metodene for all programmering er noenlunde like. I så fall kan for eksempel Javascript være en løsning:

Kode

// TOTALLY NOT REAL CODE, lol.
if sessions < 10
  deny new session
else
  accept new session
Dette er som sagt kun en idé jeg har, med litt under grunnleggende erfaring innen programmeringsspråk ..
Vis hele sitatet...
Vil ikke hjelpe siden en sesjon ikke har kunnskap om hvor mange sesjoner den brukeren har aktiv. Sesjonsdata er i utgangspunktet privat.

Sitat av esl Vis innlegg
En bruker vil alltid ha en sesjon så jeg skjønner ikke hva du skal begrense..?

Om du skal begrense tiden kan du sette lagre starttidspunktet i en sesjonsvariabel og sjekke om et gitt antall sekunder er gått. Har du et tregt skript\mye loading kan du bruke session_write_close etter du har satt starttiden.
Vis hele sitatet...
En bruker med 3 browsere vil ha 3 sesjoner til applikasjonen, jeg vil begrense det til f.eks 2.

Sitat av Molty Vis innlegg
--Edit--
Så ikke at trådstarter skrev "på disk".

For trådstarter vil jeg heller anbefale å lagre sesjoner i en database.
I en database tabell hvor du lagrer aktive sesjoner. Hvor hver innlogging får en egen key.

Vil og anbefale at du tilbyr at man kan huske innloggingen via cookie.

Når du finner en key som eksisterer for brukeren, oppdaterer du bare sist logget på i et av feltene i samme tabell som keyen.
Når du IKKE finner en valid key OG det er maks antall sesjoner for den brukeren, fjerner du den som sist var aktiv ved å skrive f.eks
ORDER BY last_logged ASC
(tror den skal sortere etter laveste først og så stige, aka den gamleste kommer først)
og så legger du til den nye. Var det godt nok forklart?

- Molty
Vis hele sitatet...
Blir det samme egentlig som å bruke sesjonsdata som ligger på disk, men ja jeg forstår hva du mener.

Sitat av Fortran Vis innlegg
For å vite om ei session-fil hører til en gitt bruker, kan du lagre brukernavnet i en session-variabel. Så kan du deserialisere alle session-filene og slette de som matcher brukernavnet.

Det er brute force og lite effektivt, så du bør heller legge inn en tabell i databasen med kolonner for timestamp, bruker-ID og session-ID. Da kan du spøle gjennom tabellen og slette filene <session.save_path>/sess_<session-ID> kjapt og enkelt.

PHP utfører garbage collection på session-filene, så du må håndtere at filer allerede er slettet.
Vis hele sitatet...
Det gjør jeg allerede. Dog ser jeg ikke hvordan dette er ueffektiv måte å gjøre det på, tror sql kall har høyere overhead enn å lese 100+ filer på disk.
Sitat av tore- Vis innlegg
Det gjør jeg allerede. Dog ser jeg ikke hvordan dette er ueffektiv måte å gjøre det på, tror sql kall har høyere overhead enn å lese 100+ filer på disk.
Vis hele sitatet...
Du mener et lineært søk i filsystemet, hvor du må deserialisere filene for å finne nøkkelen, er kjappere enn et søk i en relasjonsdatabase?
MINST 12år
tore-'s Avatar
Trådstarter
Sitat av Fortran Vis innlegg
Du mener et lineært søk i filsystemet, hvor du må deserialisere filene for å finne nøkkelen, er kjappere enn et søk i en relasjonsdatabase?
Vis hele sitatet...
Akkuratt på dette oppsettet; ja. Dette er en server med 1 vCPU, 256MB RAM og SATA disk. Er litt begrenset hva jeg kan kjøre på den.