johny7: Mehrere Sessions auf einer Domain

Moin allerseits,

ich habe auf einer Domain eine Website und eine Web-Applikation. Letztere funktioniert nur mit Sessions, bei der ersten kann man sich ggf. auch Einloggen. Nun habe ich aber folgendes Problem:

Wenn man sich sowohl hier als auch da einloggt, sind alle Session-Daten überall verfügbar. D.h. die Variablen der Applikation sind auch auf der Website verfügbar. Wenn ich mich nun aber z.B. auf der Website auslogge, werde ich ja auch in der Applikation rausgeschmissen.

Wie kann ich das lösen, dass von einem Client auf derselben Domain verschiedene Sessions gehandelt werden? Ich habe es schon mit session_name() versucht, bin aber bisher gescheitert.

Grüße, JN

--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
  1. Hi,

    Wie kann ich das lösen, dass von einem Client auf derselben Domain verschiedene Sessions gehandelt werden? Ich habe es schon mit session_name() versucht, bin aber bisher gescheitert.

    Das ist aber der richtige Weg.
    Den save_path für die Session-Dateien solltest du auch noch für beide Applikationen unterschiedlich setzen, damit sie sich auch nicht hinsichtlich garbage collection etc. in die Quere kommen.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Moin allerseits,

      Den save_path für die Session-Dateien solltest du auch noch für beide Applikationen unterschiedlich setzen, damit sie sich auch nicht hinsichtlich garbage collection etc. in die Quere kommen.

      Das werde ich überprüfen.

      Das ist aber der richtige Weg.

      Ich habe bisher folgende erfolglos probiert:

      login.php

        
      session_name(md5($_GET['email'])); // E-Mail ist Key des Logins  
      session_start();  
      $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT'];  
      // Weitere Session-Variablen  
      
      

      Anschließend soll die index.php aufgerufen werden:

      $sessname = session_name(); // Session-Namen aufrufen  
      if ($sessname) // Wenn Session vorhanden  
              {  
              session_name($sessname); // Session-Namen aktualisieren  
              // Eine Session ist vorhanden  
              session_start(); // Session starten  
              }  
      
      

      Das funktioniert aber nicht. Ich dachte, ich hole mir den Namen der Session (den habe ich ja im Folgeaufruf nicht mehr) und setze dann den Session-Namen neu. Aber ich bekomme immer PHPSESSID zurück.

      Noch einmal zum Ablauf: In der login.php lege ich eine benannte Session an. Als Session-Namen verwende ich die md5 der E-Mail-Adresse.

      In der index.php versuche ich an den Namen der Session zu kommen. Das mache ich mit einer Zuweisung von session_name() an $sessname. Normalerweise müsste doch dort die md5 der E-Mail-Adresse stehen. Aber wenn ich $sessname danach sofort in eine Konstante schreibe und später ausgebe, steht PHPSESSID drin.
      Ich wollte dann anhand von $sessname überprüfen, ob eine Session gesetzt wird und nochmal den Session-Namen mit $sessname setzen (laut php.net muss session_name() ja jedes mal neu gesetzt werden, damit der Name nicht überschrieben wird). Und das klappt jetzt nicht.

      Außerdem ist es doch nicht performant, wenn bei jedem Aufruf mit session_start() eine Session angelegt wird. Ich brauche die Session ja nur, wenn jemand eingeloggt ist. Im übrigen habe ich die E-Mail-Adresse desjenigen, der eingeloggt ist, nur beim Login-Vorgang. D.h. ich kann sie in der index.php nicht für session_name() verwenden.

      Grüße, JN

      --
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
      1. Hi,

        Anschließend soll die index.php aufgerufen werden:

        $sessname = session_name(); // Session-Namen aufrufen

        if ($sessname) // Wenn Session vorhanden
                {
                session_name($sessname); // Session-Namen aktualisieren
                // Eine Session ist vorhanden
                session_start(); // Session starten
                }

        
        >   
        > Das funktioniert aber nicht.  
          
        Kann es ja auch nicht - du kannst nicht erwarten, den Namen einer Session zu erhalten, wenn es noch gar keine Session gibt (also session\_start noch nicht aufgerufen wurde).  
          
        
        > Noch einmal zum Ablauf: In der login.php lege ich eine benannte Session an. Als Session-Namen verwende ich die md5 der E-Mail-Adresse.  
          
        Und vorher soll ein Folgescript davon etwas wissen?  
          
        Du scheinst das grundlegende Funktionsprinzip von Sessions noch nicht verstanden zu haben.  
        Um einen Client wiedererkennen zu können, wird diesem ein Zufallswert zugeordnet - das ist die Session-ID. Diese muss er bei Folgerequests wieder mit übergeben, und das macht er unter einem Parameternamen, der per Default PHPSESSID ist, den man aber auch anders wählen kann.  
        Wenn du diese Änderung aber \*in\* einer Scriptinstanz vornimmst, und dort den Parameternamen auf HUGO änderst - woher soll das „nächste“ Script denn wissen, dass ausgerechnet der Parameter, der ihm unter dem Namen HUGO übermittelt wird, die Session-ID enthalten soll ...? Das kann es nicht raten.  
        Wenn mehrere Scripte sich darüber einig sein sollen, dass die Session-ID unter dem Parameternamen HUGO übergeben werden soll - dann musst du diese Info entweder \*in\* jedem Script diesem bekannt machen, in dem du dort session\_name('HUGO') aufrufst, oder diese Bekanntmachung außerhalb der einzelnen Scripte in der PHP-Konfiguration machen (ggf. bspw. verzeichnis-basiert per .htaccess).  
          
        
        > Als Session-Namen verwende ich die md5 der E-Mail-Adresse.  
          
        Warum willst du den Session-\*Namen\* denn überhaupt abhängig von einer Information des konkreten Benutzers wählen?  
        Der Session-Mechanismus verwendet per Default auch einen \*festen\* Namen, PHPSESSID - was erhoffst du dir davon, von diesem Weg abzuweichen?  
          
        Nutze für deine Zweit-Session den Namen HUGO (oder einen anderen, der dir günstiger erscheint, aber einen \*festen\*) - und gut is'.  
        Den kannst du in jedem Script, dass diese Zweit-Session nutzen soll, über session\_name('HUGO') bekannt machen, und schon läuft das ganze. (Konfiguration der Speicherverzeichnisse nicht vergessen, sonst sind Probleme vorprogrammiert.)  
          
        
        > Außerdem ist es doch nicht performant, wenn bei jedem Aufruf mit session\_start() eine Session angelegt wird. Ich brauche die Session ja nur, wenn jemand eingeloggt ist.  
          
        Und um festzustellen, dass jemand eingeloggt ist, brauchst du die Session.  
        Diese Katze beißt sich selbst in den Schwanz.  
          
        MfG ChrisB  
          
        
        -- 
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?