Max: Seesion schein vorzeitig abzulaufen bzw. Daten gehen verloren

Hallo zusammen,

wir haben einen elektronischen Fragebogen laufen mit sehr vielen Fragen - jede Frage ist au einem separaten Srceen.
Der Fragebogen besteht aus einem einzigen Scrpt dass sich immer wieder selbst aufruft.
Zu Beginn muss sich der User anmelden, diese Anmededaten werden gespeichert und bei jedem Screenzugriff gecheckt.
Die Daten aus dem Fragebogen werden ebenfalls in die Session geschrieben.
Nun verliert das Script offensichtlich in völlig unregelmäßigen Abständen die Daten aus der Sesson - was dazu führt dass unsere User aus dem System geworfen werden - da beim check der Userdaten diese nicht mehr vorhanden sind.

Gibt es irgendeine Einstellung die die Grösse der Session regelt bzw. begrenzt?
Könnte es damit zusammenhängen, dass sehr viele User gleichzeitog online sind?

Allerdings läuft eine andere Applikation auf demselben Server ebenfalls mit einigen Sessionzugriffen problemlos!

Vielen Dank für Eure Bemühungen
Grüsse Max

  1. hi,

    Nun verliert das Script offensichtlich in völlig unregelmäßigen Abständen die Daten aus der Sesson

    unwahrscheinlich, eine regel gibt es immer. 0 oder 1

    • was dazu führt dass unsere User aus dem System geworfen werden - da beim check der Userdaten diese nicht mehr vorhanden sind.

    in welcher form speicherst du die userdaten?

    Gibt es irgendeine Einstellung die die Grösse der Session regelt bzw. begrenzt?

    keine ahnung, aber ich glaub irgendwo ( hier im forum!!!) gelesen zu haben, das sessions nicht größer als 5kb sein sollten ( was GROß ist)

    Könnte es damit zusammenhängen, dass sehr viele User gleichzeitog online sind?

    denke ich nicht ( platz auf der ferstplatte? )

    Allerdings läuft eine andere Applikation auf demselben Server ebenfalls mit einigen Sessionzugriffen problemlos!

    na siehste, also liegts an deinem script!

    ein codeschnipsel den du hier posten würdest wäre vielleicht hilfreicher.

    ciao

    ronny

    1. Hallo ronny,

      aber ich glaub irgendwo ( hier im forum!!!) gelesen zu haben, das sessions nicht größer als 5kb sein sollten ( was GROß ist)

      Ich hab schon Sessions mit 500 KB und mehr verwendet...

      Viele Grüße,
      Christian

      1. hi,

        aber ich glaub irgendwo ( hier im forum!!!) gelesen zu haben, das sessions nicht größer als 5kb sein sollten ( was GROß ist)

        Ich hab schon Sessions mit 500 KB und mehr verwendet...

        ja ich war wieder mal blind *gg*

        http://www.dclp-faq.de/q/q-sessions-datenmenge.html

        da steht zwar was von 5kb, aber nicht das es die max größe ist *grins*

        also...es geht auch größer..;)

        schönen abend noch..
        ronny

    2. hi ! Das es an dem Script liegt, kann ich mir aus zwei Gründen nicht vorstellen:

      1.) Das Skript ruft sich immer wieder selbst auf, der Unterschied bei jedem Aufruf ist lediglich, dass ein laufindex mitzählt und bei jedem Durchgang die nächste Frage per include einbindet:
      1. Durchgang:   include ("frage_1.php")
      2. Durchgang:   include ("frage_2.php")
      .
      n. Durchgang:   include ("frage_n.php")

      In den Frage-Includefiles steht auch nichts besonderes, lediglich die Formularelemente werden mit den schon gemachten Angaben gefüllt, falls mal jemand auf die schon ausgefüllten Fragen klickt.
      Die Daten werden in der Session gespeichert, insgesamt gibt es 400 Fragen mit 600 Variablen, also schon ne Menge...

      2.) Das "aus dem System fliegen" passiert nicht nur beim Frabo-Skript, sondern auch bei einem angegliederten Auswertungsskript, das nur vom Admin eingesehen werden kann.

      Die User-Authentifizierung erledigt übrigens die Klasse patUser...

      Vielen Dank für Eure Antworten! Grüße: Max

    3. Hello,

      keine ahnung, aber ich glaub irgendwo ( hier im forum!!!) gelesen zu haben, das sessions nicht größer als 5kb sein sollten ( was GROß ist)

      Das ist ein Gerücht. Sesssiondateien können durchaus ca. 1/5 des für das Script zur Verfügung stehenden Speichers (8MB sind Standard) haben, ohne dass es Probleme gibt. Kommt natürlich darauf an, was man an Speicherbedarf _im_ Scipt sonst so hat.

      Größerer Bedarf wird dann eben über Flat-Files ausgelagert. Da kann man dann nochmal locker Faktor 1000 schaffen. Wenn die ausgelagerten Dateien zu groß werden, muss man aber leider darauf verzichten, sie komplett einzulesen, sondern muss sie eben blockweise verarbeiten.

      Wenn man die ausgelagerten Dateien bei Linux-Systemen mit im Sessionverzeichnis abspeichert, dann kann man sie auch vom GC automatisch mit entsorgen lassen. Der schaut nämlich nur nach dem last_touched und der Vorsilbe "sess_"

      GC funktioniert _nicht_ bei Windows-Systemen!

      Grüße

      Tom

  2. Hallo Max,

    Nun verliert das Script offensichtlich in völlig unregelmäßigen Abständen die Daten aus der Sesson - was dazu führt dass unsere User aus dem System geworfen werden - da beim check der Userdaten diese nicht mehr vorhanden sind.

    na, endlich hat auch mal jemand anders das Problem. Ich bin damit ja nirgends ernst genommen worden ;)

    Könnte es damit zusammenhängen, dass sehr viele User gleichzeitog online sind?

    so war es bei mir. Eine Logik kann ich da zwar nicht erkennen, aber es trat immer nur auf, wenn mehr als ein client gleichzeitig auf das Script zugegriffen haben. Die löschen sich dann gegenseitig die Sessions.

    nach einem Jahr(!) vergeblicher Fehlersuche habe ich das Problem vor einigen Tagen scheinbar gelöst: Ich habe auf jeder Seite des Projekts _vor_ session_start() diese Zeile gesetzt:
    ini_set('session.gc_probability', 0);
    und bisher ist der Fehler nicht mehr aufgetreten.

    bitte schreib' mal hier, ob das bei Dir was nützt - ich glaube dann ist ein PHP-Fehler entlarvt.

    Gruß, Andreas

    1. hi,

      Die löschen sich dann gegenseitig die Sessions.

      das geht doch eigentlich gar nicht. session id entsteht doch mit anhand der zeit. dann müsste ja ständig ZUFÄLLIG die benutzer alle zur gleichen zeit zugegriffen haben...sehr unwahrscheinlich.

      ronny

      1. Hello ronny,

        das geht schon.

        Die Löschung der SessionDATEIEN (mehr wird da nicht gemacht) findet nach einem bestimmten Algorithmus statt, der von den Funktionen session_start() oder session_register() angestoßen wird. Vorher wird eine Wahrscheinlichkeitsprüfung gemacht nach der schon erwähnten Einstellung session.gc_probability.

        Wenn man die auf 0 setzt, kann man auch gleich das _Verzeichnis_ der Sessiondateien gegen lesen sperren, aber bitte _nicht_  die Sessiondateien selber.

        Der GC kann dann keinen Verzeichnisscan mehr durchführen und lässt die Sessiondateien in Ruhe. Dann muss man natürlich eine eigene Aufräummethode haben, sonst platzt irgendwann die Platte. Oder man macht es so wie ich: authentifizierte User bekommen immer die selbe Session wieder. Dann kann die Anzahl der Sessiondateien nicht mehr über alle Grenzen wachsen. Man muss dann aber zusätzliche Maßnahmen für den Zugriffsschutz ergreifen.

        Grüße

        Tom

  3. hi Leute! Vielen Dank für Eure Hilfe,

    ich habe noch ein Update:
    Die Session Files im tmp Verzeichnis werden definitiv nicht gelöscht, sondern bei session_start() wird aus unerfindlichen Gründen nicht mehr darauf zugegriffen, sondern ein neues wird angelegt.
    Was haltet ihr davon?

    1. session_start() wird aus unerfindlichen Gründen nicht mehr darauf zugegriffen, sondern ein neues wird angelegt.
      Was haltet ihr davon?

      dann ist die SID verloren gegangen, oder? Hatte ich auch. Hast Du meinen Tip mal beherzigt und ausprobiert?

      Gruß, Andreas

      1. Hi Andreas!
        Nach dem ich entdeckt hatte, dass die Session-Dateien nicht gelöscht wurden nahm ich an, dass der Befehl
        ini_set('session.gc_probability', 0);
        keine Verbesserung bringen kann, weil er (soweit ich das verstanden habe) lediglich das Löschen der Session-Dateien verhindert, entsprechend habe ich es noch nicht ausprobiert.

        Sehe ich das falsch?
        Viele Grüße: Max

        1. Sehe ich das falsch?

          mein Tip ist nun 3 Tage alt. Probiers mal aus. Ich hab's auch probiert und hatte die gleichen Probleme wie Du - nun sind sie weg.

          Gruß, Andreas

          1. habs heute morgen eingebaut, hatte zuerst auch den eindruck einer verbesserung, aber ein paar sind auch schon wieder rausgeflogen. man kann leider schwer sagen, ob es an ihnen lag, oder am system - manche leute machen ja die seltsamsten dinge...

            das phänomen ist wirklich eigenartig. ich sollte vielleicht dazu sagen, dass sich schon mehrere erfahrene programmierer mit dem problem beschäftigt haben. keiner kann es erklären :(

            auf jeden fall dank für deine mühe! max

            1. Moin!

              das phänomen ist wirklich eigenartig. ich sollte vielleicht dazu sagen, dass sich schon mehrere erfahrene programmierer mit dem problem beschäftigt haben. keiner kann es erklären :(

              Wie wird die Session-ID eigentlich übergeben? Cookie oder URL?

              Ich würde einen Bug sowohl in PHP, aber auch im Browser nicht ausschließen.

              Und wenn du das Phänomen wirklich genauestens untersuchen willst, wirst du irgendeinen zusätzlichen, von allen PHP-eigenen unabhängigen Session-Mechanismus erfinden müssen, welcher es dir erlaubt, sofort beim Rausfliegen Alarm auszulösen und interessante Daten zu loggen. Oder eben alle Daten zu loggen und die Benutzer anzuweisen, beim Rausfliegen sofort einen "Ich bin rausgeflogen"-Button zu klicken, damit diese Events festgehalten und untersucht werden können.

              Nur wenn du viel loggst, diese Daten dann auswertest und auf Regelmäßigkeiten untersuchst, wirst du das Problem eventuell herausfinden.

              BTW: Welche Versionen setzt du eigentlich ein (Server, PHP)?

              - Sven Rautenberg

              --
              "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
              (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)