Arne: session_start()

Hallo,

ich inkludiere zu Begin jedes Scriptes meines Projektes eine Datei, die mit

session_start();

beginnt.

Leider verliere ich sporadisch innerhalb des Projektes immer wieder mal die Session und kann es noch nicht reproduzieren.

Wo setze ich zum Debug an? Hat jemand eine Idee?

Arne

  1. Hallo,

    ich inkludiere zu Begin jedes Scriptes meines Projektes eine Datei, die mit

    session_start();

    beginnt.

    Leider verliere ich sporadisch innerhalb des Projektes immer wieder mal die Session und kann es noch nicht reproduzieren.

    Wo setze ich zum Debug an? Hat jemand eine Idee?

    Arne

    ich hoffe dass du Scripte hast die du in jeder Webseite brauchst. Globale Funktionen oder sowas. Die Includierst du in jeder Seite? Dann lass dir dort die Session ausgeben - print_r($_SESSION).
    Dann klickst du dich durch die Webseite. Dort wo die Session nicht ausgegeben wird, wird sie nicht initialisiert.

    Gruß
    session_destroy();
    T-Rex

    1. Dann lass dir dort die Session ausgeben - print_r($_SESSION).
      Dann klickst du dich durch die Webseite. Dort wo die Session nicht ausgegeben wird, wird sie nicht initialisiert.

      Hi T-Rex,

      das sind fast zuviele mögliche Seiten. Deshalb habe ich das automatisiert und lasse mich per mail benachrichtigen, wenn die Session verloren geht. Aus diesen Informationen habe ich den Verdacht, die Session nur sporadisch zu verlieren.

      Da das Ganze nach einem Serverwechsel aufgetreten ist und ich eigentlich am Sessionmanagement nichts geändert habe, gabe ich mir die Sessioneinstellungen der Server mal vorgenommen.

      Unterschiede:

      session.use_only_cookies Off Off (alter Server)
      session.use_only_cookies ON ON (neuer Server)
      session.gc_divisor         1000 1000 (alter Server)
      session.gc_divisor         100 100 (neuer Server)
      session.save_path 2;/var/tmp 2;/var/tmp (alter Server)
      session.save_path no value no value (neuer Server)

      Gibt es Gründe, die dafür sprechen, dass sporadisch ein Cookie nicht lokal gespeichert werden kann und somit das URL-Fallback nicht greift?

      Das wäre eine Erklärung für mich.

      Arne

      1. Hi!

        Aus diesen Informationen habe ich den Verdacht, die Session nur sporadisch zu verlieren.

        Sporadisch ist bei dir welcher Zeitraum? Was passiert genau? Ist die Session-Datei weg? Prüf das mal vor dem Session-Start. Den Dateinamen kann man ja aus der Session-ID bilden (diese aus dem Cookie lesen, da session_id() erst nach dem session_start() liefert).

        Da das Ganze nach einem Serverwechsel aufgetreten ist und ich eigentlich am Sessionmanagement nichts geändert habe, gabe ich mir die Sessioneinstellungen der Server mal vorgenommen.

        session.save_path no value no value (neuer Server)

        Bei Servern mit mehreren PHP-Anwendungen, die alle unter der selben Kennung laufen, ist es nicht sehr clever, keinen individuellen Speicherort für die Sessiondaten zu verwenden. Denn dann können von anderen angestoßene Garbage-Collections fremde Sessions aufräumen.

        Gibt es Gründe, die dafür sprechen, dass sporadisch ein Cookie nicht lokal gespeichert werden kann und somit das URL-Fallback nicht greift?

        Ja, aber du wirst dem Browser das sicher nicht das Annehmen verboten haben.

        Lo!

        1. Hi,

          Sporadisch ist bei dir welcher Zeitraum? Was passiert genau? Ist die Session-Datei weg?

          Das kann ich so gar nicht einschränken. Es passiert mehrfach am Tag. 2-3 mal auf ca. 1000-2000 Klicks bezogen.
          Es ist selten mal dieselbe Seite, es sind immer andere. Die aber laufen sonst normal durch, ohne die Session zu verlieren.

          Bei Servern mit mehreren PHP-Anwendungen, die alle unter der selben Kennung laufen, ist es nicht sehr clever, keinen individuellen Speicherort für die Sessiondaten zu verwenden.

          Kann ich den denn überhaupt selber einstellen bei einem managed-server?

          Grüße, Arne

          1. Hi!

            Sporadisch ist bei dir welcher Zeitraum? Was passiert genau? Ist die Session-Datei weg?
            Das kann ich so gar nicht einschränken. Es passiert mehrfach am Tag. 2-3 mal auf ca. 1000-2000 Klicks bezogen.

            Einfach so mitten beim Arbeiten oder nach einer Pause von mindestens session.gc_maxlifetime Sekunden?

            Es ist selten mal dieselbe Seite, es sind immer andere. Die aber laufen sonst normal durch, ohne die Session zu verlieren.

            Ermittle mal, ob die Datei weg ist - wobei da auch nicht rauszukriegen ist, ob sie der eigene oder ein fremder GC weggeräumt hat.

            Bei Servern mit mehreren PHP-Anwendungen, die alle unter der selben Kennung laufen, ist es nicht sehr clever, keinen individuellen Speicherort für die Sessiondaten zu verwenden.
            Kann ich den denn überhaupt selber einstellen bei einem managed-server?

            Na klar. session.save_path ist PHP_INI_ALL-changeable, was heißt, dass du selbst im Script noch - vor dem Session-Start - den Pfad umkonfigurieren kannst.

            Lo!

            1. Hi,

              Einfach so mitten beim Arbeiten oder nach einer Pause von mindestens session.gc_maxlifetime Sekunden?

              Da es ja den Usern passiert und nicht mir, kann ich das nicht genau sagen.
              Aber es war auch mein erster Gedanke.
              Deshalb habe ich gestern schon in meine Datei, die die Sessions erstellt bzw. erweitert, ini_set('session.gc_maxlifetime',3800); ini_set('session.cookie_lifetime',3800); session_start(); eingetragen.
              Kann ich prüfen, ob diese Änderung greift oder bin ich da auf Vetrauen angewiesen?

              Ermittle mal, ob die Datei weg ist - wobei da auch nicht rauszukriegen ist, ob sie der eigene oder ein fremder GC weggeräumt hat.

              Die auf dem Server? Weil, ob die Cookiedatei futsch ist, werde ich nicht ermitteln können.

              Na klar. session.save_path ist PHP_INI_ALL-changeable, was heißt, dass du selbst im Script noch - vor dem Session-Start - den Pfad umkonfigurieren kannst.

              Ok. Das werde ich dann auf jeden Fall machen. Gibt es eigentlich eine Möglichkeit, ein komplett db-seitiges Session-Management zu bauen oder ist man auf php-Sessions angewiesen??

              Greetz, Arne

              1. Hi,

                Deshalb habe ich gestern schon in meine Datei, die die Sessions erstellt bzw. erweitert, ini_set('session.gc_maxlifetime',3800); ini_set('session.cookie_lifetime',3800); session_start(); eingetragen.
                Kann ich prüfen, ob diese Änderung greift oder bin ich da auf Vetrauen angewiesen?

                ini_get/phpinfo

                Ermittle mal, ob die Datei weg ist - wobei da auch nicht rauszukriegen ist, ob sie der eigene oder ein fremder GC weggeräumt hat.

                Die auf dem Server? Weil, ob die Cookiedatei futsch ist, werde ich nicht ermitteln können.

                Wie soll sich denn der Garbage Collector von PHP um Cookie-„Dateien“ auf dem Client kümmern ...?

                So richtig viel Ahnung von dem ganzen hast du noch nicht, oder?
                Beschäftige dich mal ein bisschen mehr mit den Grundlagen - ein grundlegendes Verständnis der Abläufe wäre schon hilfreich, wenn man ein solches Problem analysieren will.

                Gibt es eigentlich eine Möglichkeit, ein komplett db-seitiges Session-Management zu bauen oder ist man auf php-Sessions angewiesen??

                Klar gibt es die.
                Und auch PHPs Session-Mechanismus ist nicht auf Speicherung der Daten im Dateisystem festgelegt. Du kannst dir sogar komplett eigene Handler schreiben, und PHPs Session-Mechanismus anweisen, diese zu nutzen. Steht aber auch alles im Handbuch beschrieben.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
              2. Hi!

                Das Posten unter mehreren Nicks ist schon keine Angelegenheit, die Jubelschreie hervorruft, aber wenigstens innerhalb eines Threads solltest du darauf achten, bei einem Namen zu bleiben. Wenn der Eindruck entsteht, dass du mit dem Forum Spielchen treibst, leidet darunter auch die Zahl der sachdienlichen Hinweise zum Lösen von Problemen.

                Ermittle mal, ob die Datei weg ist - wobei da auch nicht rauszukriegen ist, ob sie der eigene oder ein fremder GC weggeräumt hat.
                Die auf dem Server? Weil, ob die Cookiedatei futsch ist, werde ich nicht ermitteln können.

                Browser speichern Cookies auf unterschiedliche Weise. Wenn du die session.cookie_lifetime nicht änderst, wird der Cookie im Browser nur flüchtig aufbewahrt, sprich: beim Schließen entsorgt. Was der Browser allerdings mit dem Session-Cookie macht, kann dir egal sein, Hauptsache er schickt ihn mit. Das ist auch das einzige, was du prüfen kannst. Und aus der ID in diesem Session-Cookie kannst du auch den Dateinamen für die Session-Daten auf dem Server bilden. Die, meinte ich, solltest du auf Vorhandensein prüfen.

                Lo!

                1. Hi!

                  Das Posten unter mehreren Nicks ist schon keine Angelegenheit, die Jubelschreie hervorruft, aber wenigstens innerhalb eines Threads solltest du darauf achten, bei einem Namen zu bleiben.

                  Hi Dedlfix,

                  genau deshalb hab ich Günni gebeten, unter meienm Namen zu posten. Und das hat ja auch fast geklappt. ;-)

                  Das ist auch das einzige, was du prüfen kannst. Und aus der ID in diesem Session-Cookie kannst du auch den Dateinamen für die Session-Daten auf dem Server bilden. Die, meinte ich, solltest du auf Vorhandensein prüfen.

                  Ich habe jetzt mal über ini_set ('session.save_path' den Pfad für die Sessiondateien neu gesetzt. Außerhalb des htdocs natürlich und für jede PHP-Anwendung ein Unterverzeichnis.

                  Frage dazu wäre folgende. Ich setze ein session_start() nach dem login. Danach will ich die Session immer wieder erneuern, solange der User eingeloggt bleibt.
                  Dazu inkludiere ich eine Datei, in der ebenfalls session_start() steht. Muß ich dann ebenfalls wieder ini_set ('session.save_path' notieren, damit die Session wieder dort aufgenommen wird, wo sie ursprünglich startete?

                  Nochmals Grüße, Arne

                  1. Hi,

                    genau deshalb hab ich Günni gebeten, unter meienm Namen zu posten. Und das hat ja auch fast geklappt. ;-)

                    Wieso diskutieren wir das Problem überhaupt mit zwei Personen?
                    Und wenn diese zwei Personen tatsächlich zwei Personen sind (und nicht nur in einem Geist existieren ...) - wieso postet dann nicht jede unter ihrer eigenen Identität, und ihr teilt uns aber mit, dass ihr euch zusammen um dieses Problem kümmert ...?

                    Dazu inkludiere ich eine Datei, in der ebenfalls session_start() steht. Muß ich dann ebenfalls wieder ini_set ('session.save_path' notieren, damit die Session wieder dort aufgenommen wird, wo sie ursprünglich startete?

                    Natürlich musst du den save_path, sofern er von dem in der Konfiguration angegebenen abweichen soll, jedes Mal wieder setzen, bevor du session_start aufrufst.
                    Andernfalls würde session_start wieder im Default-Verzeichnis nach der Session-Datei suchen, sie dort nicht finden - und demzufolge wieder eine neue erstellen.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                  2. Hi!

                    Ich setze ein session_start() nach dem login. Danach will ich die Session immer wieder erneuern, solange der User eingeloggt bleibt.

                    Erneuern? Wohl eher wiederaufnehmen. Erneuern könnte man ohne Datenverlust nur die Session-ID (...regenerate...).

                    Dazu inkludiere ich eine Datei, in der ebenfalls session_start() steht. Muß ich dann ebenfalls wieder ini_set ('session.save_path' notieren, damit die Session wieder dort aufgenommen wird, wo sie ursprünglich startete?

                    Du brauchst ein session_start() pro Request (natürlich nur wenn für diesen mit der Session gearbeitet werden soll). Und vor diesem session_start() pro Request muss die Konfiguration stimmen, entweder durch Default-Werte, die php.ini oder händisch nachgezogene. In deinem Fall musst du also vor jedem session_start() die anderswo schon geänderten Konfigurationsparameter ebenfalls auf gleichen Wert ändern. Das ist natürlich umständlich und es lohnt sich zu prüfen, ob man da nicht was Globales konfigurieren kann.

                    PHP als Apache-Modul: .htaccess
                    PHP ab 5.3: .user.ini
                    PHP als CGI: php.ini im Verzeichnis der für den Request gestarteten Datei. (So eine php.ini ersetzt die Systemkonfiguration komplett, muss also alle von den Defaultwerten abweichende Änderungen berücksichtigen.

                    Lo!

                    1. Hi Dedlfix,

                      Erneuern? Wohl eher wiederaufnehmen. Erneuern könnte man ohne Datenverlust nur die Session-ID (...regenerate...).

                      Ja klar. Wieder aufnehmen.

                      Du brauchst ein session_start() pro Request (natürlich nur wenn für diesen mit der Session gearbeitet werden soll).

                      Prima. Das hatte ich vermutet, aber wußte es nicht definitiv.

                      Und vor diesem session_start() pro Request muss die Konfiguration stimmen, entweder durch Default-Werte, die php.ini oder händisch nachgezogene.

                      Alles klar.

                      PHP als Apache-Modul: .htaccess
                      PHP ab 5.3: .user.ini
                      PHP als CGI: php.ini im Verzeichnis der für den Request gestarteten Datei. (So eine php.ini ersetzt die Systemkonfiguration komplett, muss also alle von den Defaultwerten abweichende Änderungen berücksichtigen.

                      Bei mir läuft vers. 5.3.

                      Aber im Script selber habe ich viel schöner die Möglichkeit, das Unterverzeichnis in einer Variable zu setzen, um so je Script einen eigenen session-pfad zu haben.

                      Nochmals Grüße, Arne

                      1. Hi!

                        Bei mir läuft vers. 5.3.
                        Aber im Script selber habe ich viel schöner die Möglichkeit, das Unterverzeichnis in einer Variable zu setzen, um so je Script einen eigenen session-pfad zu haben.

                        Man will doch eigentlich nicht pro Script sondern pro Anwendung die gleichen Werte haben. Und Anwendungen liegen am besten fein säuberlich getrennt jede in ihrem eigenen Verzeichnisbereich. Da ist es doch ein einfaches, eine .user.ini (bei CGI) oder eine .htaccess (bei Modul) im Root dieser Anwendung zu platzieren.

                        Lo!

                        1. Hi,

                          Man will doch eigentlich nicht pro Script sondern pro Anwendung die gleichen Werte haben.

                          Richtig. Aber ich will doch je Usergruppe ein eigenes Verzeichnis haben.

                          Gruß, Arne