Sam: Wieviel sollte man in einer Session maximal speichern?

Moin

ich möchte gerne in der Session des Benutzers ein paar dutzend IDs von Newsbeiträgen speichern, die dieser schon gelesen hat, um sie speziell markieren zu können. Diese IDs sind reine Integer Werte ca. zwischen 1 und 100000. Ist das zuviel für eine Session, oder schafft sie das schon? Nicht dass bei einigen 100 Benutzern dann der Server zusammenbricht.

Gruß Sam

  1. Hello,

    1. --> [pref:t=80511&m=467343]

    2. --> Diese Daten gehören nun wahrhaftig nicht in die Sessiondatei,
           wenn man die Artikel in einer Datenbank hat. Dann legt man eine
           zusätzliche Tabelle an und gestaltet die Abfrage entsprechend.

    Sessiondateien sind flüchtig. Das bedeutet, dass sie eigentlich spätestens zu Beginn einer neuen Session gelöscht werden sollten. Sonst würde sich in der Sessiondatei nach und nach eine Menge Müll ansammeln können.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Sessiondateien sind flüchtig. Das bedeutet, dass sie eigentlich spätestens zu Beginn einer neuen Session gelöscht werden sollten. Sonst würde sich in der Sessiondatei nach und nach eine Menge Müll ansammeln können.

      Das weiß ich schon, ich brauche sie nur um anzuzeigen was gelesen wurde seit der Benutzer mit der Session angemeldet ist. Ist es nicht viel aufwändiger für den Server, wenn er ständig IDs in die Datenbank eintragen und wieder abrufen muss?

      1. Hello,

        Das weiß ich schon, ich brauche sie nur um anzuzeigen was gelesen wurde seit der Benutzer mit der Session angemeldet ist. Ist es nicht viel aufwändiger für den Server, wenn er ständig IDs in die Datenbank eintragen und wieder abrufen muss?

        Gut. Das war die zweite Möglichkeit. Ich habe hier für mich gewettet, was Du wohl erreichen wolltest. Ist eben oft "Rot oder Schwarz"... ;-)

        Ich plädiere hier immer für verteilte Last. Der Apache schafft nur eine gewisse Anzahl von MIPS. Wenn man die DB nun auf einer separaten Maschine hat, dann sollte man die Datenbereitstellung schon von der Viewaufbereitung trennen. Auch sonst gleucbe ich, dass die Bereitstellung der Daten von der DBE (kompilierte Methoden) wesentlich schneller erledigt werid, als von einer Scriptsprache, auch wenn PHP mit seinen Arrayfunktionen fast unschlagbar schnell ist.

        Und den Datenstrom sollte man auch nicht vernachlässigen, wenn man z.B. gelesene Threads gar nicht anzeigen will, nur die Schlagzeile, z.B. aber nicht den ausführlicheren Kurztext...

        Das ist aber Programmiererlos und damit Philosophie.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Die Session wird ja nach einer halben Stunde oder so automatisch wieder gelöscht. Schreibe ich alle IDs für alle User in eine extra Tabelle in der DB wird diese irgendwann total zugemüllt, weil ich die IDs ja immer nur für die aktuelle Session brauche, da ich sowieso mit letzter Loginzeit arbeite.

          1. Hello,

            Die Session wird ja nach einer halben Stunde oder so automatisch wieder gelöscht. Schreibe ich alle IDs für alle User in eine extra Tabelle in der DB wird diese irgendwann total zugemüllt, weil ich die IDs ja immer nur für die aktuelle Session brauche, da ich sowieso mit letzter Loginzeit arbeite.

            Da musst Du dann eben gelegentlich einen Aufräummechanismus anstoßen, so wie das die Sessionverwaltung von PHP auf UNIX-Systemen auch tut.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Tja nur wenn ich solche Cronjobs auf dem Server nicht haben darf siehts blöd aus. Weil manuell will ich das nicht immer ausführen, da vergess ich sicher drauf.

              1. Hello,

                Tja nur wenn ich solche Cronjobs auf dem Server nicht haben darf siehts blöd aus. Weil manuell will ich das nicht immer ausführen, da vergess ich sicher drauf.

                Nicht per Cronjob lösen, sondern per Script. Du könntest z.B. immer dann, wenn eine neue Session gestartet wird, diese Funktion ausführen lassen. Das ist ja nur ein SQL-Statement.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      2. Moin!

        Das weiß ich schon, ich brauche sie nur um anzuzeigen was gelesen wurde seit der Benutzer mit der Session angemeldet ist. Ist es nicht viel aufwändiger für den Server, wenn er ständig IDs in die Datenbank eintragen und wieder abrufen muss?

        Ich denke, deine Methode dürfte durchaus effizient sein. Ist halt die Frage, wie sich das alles auswirkt.

        Wenn du die "gelesen"-Markierung in der DB abspeicherst und zum normalen Betrieb in die Session holst, um DB-Zugriffe zu sparen, steigert das sicherlich die Performance.

        Andererseits: Wenn du immer alle Beiträge aus der DB holst, nur um dann die wegzulassen, die schon gelesen wurden, ist das sicherlich nicht performancesteigernd, weil die Datenbank wahrscheinlich unnötig viel arbeitet. Jedenfalls sofern das Verhältnis von anzuzeigenden zu gelesenen Beiträgen ungünstig wird, und relativ viele Beiträge existieren.

        Außerdem mußt du ja bei jedem Beitrag prüfen, ob dieser schon gelesen wurde - bei ungünstig gestaltetem Array ist das unnötig aufwendig, bei günstig gestaltetem Array ganz simpel.

        Es spricht jedenfalls grundsätzlich nichts dagegen, mehrere Kilobyte an Daten in einer Session zu speichern. Die Frage bleibt nur: Was passiert sonst noch so.

        - Sven Rautenberg

        1. Also ich möchte die Einträge natürlich schon anzeigen, sie sollen nur farblich anders gekennzeichnet werden, das ist alles. Liest nun ein User einen als nicht gekennzeichneten Beitrag trage ich die ID in ein Array in der Session ein. Abfragen werde ich das Array immer mit in_array, was ja eigentlich sehr schnell gehen sollte, da in dem Array ja nur reine Integer Werte stehen werden.

          Ist das soweit in Ordnung, wie ich mir das vorgestellt habe?

          1. Hello,

            ... dann nimm doch die ID des Eintrags gleich als Index in das Array. Das geht ggf. noch etwas schneller und macht auch keine Probleme, wenn ein Teilnehmer einen Beitrag mehrfach liest, was ihm doch scheinbar erlaubt ist.

            if (isset($_gelesen[$nr]))

            ...

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Gibts da nicht irgendwelche Probleme, wenn ein Array nicht vom Index 0 an gefüllt wird?

              1. Hello,

                Gibts da nicht irgendwelche Probleme, wenn ein Array nicht vom Index 0 an gefüllt wird?

                Welche könntest Du dir denn vorstellen?
                Mach doch einfach mal ein paar Versuche dazu und wenn was ungewöhnliches auftritt, dann frag nochmal.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              2. Moin!

                Gibts da nicht irgendwelche Probleme, wenn ein Array nicht vom Index 0 an gefüllt wird?

                Nein.

                PHP kennt in dem Sinne keine Arrays, sondern nur Hashes. Wobei die Hashes auch keine echten Hashes sind, sondern verkettete Listen. Ein Hash zeichnet sich dadurch aus, dass die Reihenfolge der enthaltenen Elemente nicht definiert ist. Fügt man neue Einträge hinzu, könnte sich die Reihenfolge ändern. So ist es jedenfalls in Perl.

                Bei PHP sind die verketteten Listen sowohl für Arrays als auch Hashes da. Das bedeutet: Es gibt ein Vorne und Hinten bei den Listen, man kann "hinten" was dranhängen und nacheinander alle Elemente abfragen, welche immer dieselbe Reihenfolge haben.

                Insofern ist es sehr schlau, den Arrayindex passend zu wählen. Du brauchst also eigentlich nur die Beitrag-ID als Index, und als Wert ein schlichtes "true" oder "false" eintragen. Das aber auch nur, um irgendeinen sinnvollen Wert in das Element zu schreiben.

                Ob ein Beitrag mit ID $id gelesen wurde, kriegst du dann so raus:
                if (isset($array[$id])) { wurde gelesen... }
                Einen Beitrag als gelesen markieren:
                $array[$id] = true;
                Einen Beitrag als ungelesen markieren:
                unset($array[$id]);

                - Sven Rautenberg

  2. Moin!

    das hängt stark vom Server ab. 100000 sind schon verdammt viel...
    Ich würde das anders lösen und die IDs abhänging von der Benutzer-ID, bzw. Session-ID in eine DB-Tabelle schreiben. Das dürfte um einiges effizienter sein als per Standard-Sessions. Eine andere Möglichkeit wäre, gleich das komplette Session-Handling auf DB umzustellen.

    MfG
    Danny

    1. Moin!

      das hängt stark vom Server ab. 100000 sind schon verdammt viel...
      Ich würde das anders lösen und die IDs abhänging von der Benutzer-ID, bzw. Session-ID in eine DB-Tabelle schreiben. Das dürfte um einiges effizienter sein als per Standard-Sessions. Eine andere Möglichkeit wäre, gleich das komplette Session-Handling auf DB umzustellen.

      Da hast du dich verlesen, die IDs sind Zahlen bis ca. 100000, gespeichert sollen höchstens ein paar Dutzend werden.

      MfG
      Danny

      1. Sorry. Das kann man aber leicht missverstehen, weil Du nach den Zahlen geschrieben hast:

        Ist das zuviel für eine Session, oder schafft sie das schon

        Deshalb dachte ich, dass "zuviel" auf die Menge von 100000 bezogen ist.