[php & Sessions] Ingelogde gebruikers

Pagina: 1
Acties:

Onderwerpen


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ik ben bezig een ingelogde gebruikers overzicht te maken, d.m.v het openen van all mijn session files met een cronjob en het gebruikersID elke 30 sec naar een tabel te schrijven.

Nu maak ik dus een Loop, die alle sessions opstart met session_start() en daarna wil ik met $MySession->userid de gebruikersID opvragen.

Het probleem waar ik tegenaanloop is dat hij het object $MySession, zoals dat in de session file staat slechts 1 keer wil vernieuwen.

Ook als ik in de loop zet: session_unset(); of unset($MySession), wil hij die gegevens bij de volgende session niet meer laden. Als ik niet unset, dan pakt hij steeds hetzelfde object...

Hier de code zoals ik die gebruik.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$dir = "/tmp/";

if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
          if(strstr($file, "sess")){
            $session = substr($file,5);
            session_id($session);
            session_start();
            print $MySession->userid."<br>";
            //unset($session);
            //unset($MySession);
            //session_unset();
          }
        }
        closedir($dh);
    }
}


Weet iemand waarom hij de variables van de volgende session niet meer wil inladen? Komt dit omdat ze precies dezelfde naam hebben?

Weet iemand misschien een andere manier om de dat userid te achterhalen, zonder een ingewikkelde regexp te schrijven die mijn session file gaat opsplitsen om het id eruit te halen?

Ik blijf er iig vrij nuchter onder....


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

probeer session_write_close eens?

Ik moet zeggen dat ik het nog nooit zo geprobeert heb....

En ik denk dat de regexp toch het beste is.

Programmer - an organism that turns coffee into software.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
het is misschien verstandiger om bij elke pageview even een veldje in de user-table up te daten 'last-seen'. Werkt dan wel alleen voor regged users...

voorbeeldje hoe ik het doe:

opslaan:
PHP:
1
2
$db->query("UPDATE `cv_users` SET `LastSeen` = NOW() WHERE `UID` = '$user'
");

retrieval:
PHP:
1
2
$activeusers = $db->query("SELECT UID, ULogin FROM cv_users WHERE NOW()-La
stSeen < $active_user_time ORDER BY ULogin ASC;");

$active_user_time is dus een tijd die jezelf in een config file in kunt stellen (bij mij dan).

Weet niet of je hier wat aan hebt, maar et lijkt me makkelijker, en minder omslachtig dan wat jij wilt doen...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
hmm ja maar dat heeft nogal een inpact, aangezien we behoorlijk wat pageviews hebben en ik net het aantal queries wou drukken..

Ik blijf er iig vrij nuchter onder....


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
okay, dan ga ik zo even kijken naar een oplossing op jouw manier ;)

(tip, maak dit wel elke 5 minuten, ipv elke halve minuut, dat trekt ook redelijk wat cpu)

En nog een vraagje, wat versta je onder 'behoorlijk wat pageviews'?

[edit]

Je kunt niet meerdere sessions in 1 script laden, voor zover ik weet. Probeer anders gewoon met fopen de files uit te lezen, en dan via regexp je usernames uit te lezen...

[ Voor 31% gewijzigd door Grijze Vos op 04-09-2003 16:23 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ja, ik heb nu het volgende, dat werkt perfect:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        $mydb->execute_query("DELETE FROM online");
        while (($file = readdir($dh)) !== false) {
          if(strstr($file, "sess")){
            $handle = fopen ("/tmp/".$file, "r");
            $contents = fread ($handle, filesize ("/tmp/".$file));
            fclose ($handle);
            if(!empty($contents)){
              list($var, $value) = explode('|', $contents);
              $obj = unserialize($value);
              $gebruikersID = $obj->userid;
              $mydb->execute_query("INSERT INTO online
 (`gebruikersID`, `lastLoginTime`) VALUES ('$gebruikersID', NOW())");
            }
          }
        }
        closedir($dh);
    }
}


Ik zit echter nog met een ander probleem. De session.gc_maxlifetime staat heel hoog, omdat gebruikers vaak veel tijd nodig hebben om dingen te wijzigen. 45 minuten.
De sessions worden nu echter niet verwijderd als iemand de pagina verlaat d.m.v het intypen van een adres in de adresbalk. (wel al de browser gesloten wordt)

Nu zat ik te denken aan een exit popup, die de session verwijderd. Iemand nog andere ideeen?

[ Voor 6% gewijzigd door maartenvdv737 op 04-09-2003 16:35 ]

Ik blijf er iig vrij nuchter onder....


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Popups voor zoiets zijn ranzig. Lees anders ff de modified-time uit van de session file. Dat kan onder PHP/unix, weet alleen niet meer wat het makkelijkste was, daarvoor, zo uit mn hoofd.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 14-09 21:45
Ik heb nu met auto_prepend_file en auto_append_file dit gedaan. Werkt perfect!

Ik blijf er iig vrij nuchter onder....


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 12:56
Grijze Vos schreef op 04 September 2003 @ 17:27:
Popups voor zoiets zijn ranzig. Lees anders ff de modified-time uit van de session file. Dat kan onder PHP/unix, weet alleen niet meer wat het makkelijkste was, daarvoor, zo uit mn hoofd.
Soms kun je het combineren met een andere popup, dan vind ik het wel handig omdat die popup er toch al komt. Dit kunnen waarschuwingen zijn zoals wil je nietm eerst je werk opslaan e.d.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hij heeft het over een popup op een onclose command. ten eerste zijn die niet gegarandeerd, dat ze pop-uppen, en ten tweede zijn popups in bijna elke vorm ranzig. Het enige wat naar mijn mening eventueel wenselijk is, is een popup om bijv. files up te loaden, of om info te krijgen over iets. Maar voor de rest, nee, popups horen niet uit zichzelf te komen, daar moet de user zelf om vragen...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Of je doet het handig en stored je sessions al direct in een database

http://nl2.php.net/session_set_save_handler

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
eek schreef op 06 September 2003 @ 14:40:
Of je doet het handig en stored je sessions al direct in een database

http://nl2.php.net/session_set_save_handler
Als ie juist het aantal queries wil drukken, om zn mysql te ontlasten?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1