2010-02-06 6 views
7

ich die Session-Array-Cache-Stücke von Informationen aus dem db abgerufen werden:Sitzungsüberlastung - Was sind "zu viele Daten" in einer Sitzung in PHP gespeichert?

$result = mysql_query('select * from table'); 
array_push($_SESSION['data'],new Data(mysql_fetch_assoc($result))); 

Meine Frage ist, gibt es eine Grenze/eine beträchtliche Menge an Informationen, die/können sollte etwa in einer Sitzung übergeben werden ? Ist es schlecht beraten oder behindert dies die Leistung erheblich?

+0

Überprüfen Sie einfach, ob der db-Speicher für die Sitzung den Datentyp und die Länge der Spalte überprüft –

Antwort

6

Standardmäßig werden $ _SESSION-Daten auf der Festplatte im Verzeichnis/tmp Ihres Servers gespeichert. Solange du genug Platz drin hast und du nicht dein PHP-Speicherlimit erreichst, geht es dir gut.

Wenn Sie jedoch versuchen, eine SAME-Abfrage für eine größere Anzahl von Benutzern zwischenzuspeichern, möchten Sie möglicherweise APC oder Memcache verwenden, die nicht an den einzelnen Benutzer gebunden sind. Andernfalls wird im Prinzip das gleiche Ergebnis 1x für jeden Benutzer zwischengespeichert und kein Cache für alle Benutzer verwendet.

0

Da Sitzungsdaten in einer Datei (oder einem Datenbankeintrag) auf Ihrem Server gespeichert werden, sollte es nicht so wichtig sein, wie viele Daten Sie darin speichern. Ich würde nur von riesigen Objekten abraten.

Sie können sich APC oder memcached ansehen, um die Ergebnisse zwischenzuspeichern, da es sich nicht um einen benutzerspezifischen Cache handelt und der Speicher anstelle von Dateien verwendet wird.

0

Die Sitzung wird serialisiert und standardmäßig auf die Festplatte geschrieben. Je nach Größe und Anzahl der Benutzer kann es daher langsam werden. Beide Dinge können jedoch geändert werden (lesen Sie das Sitzungshandbuch unter http://php.net/session für alle Details), wie Memcache zum Speichern der Daten im Speicher. Am besten testen Sie es in einer Umgebung, die so ähnlich wie möglich zu dem Live-System ist und überprüfen Sie die resultierende Last und den Durchsatz.

1

Ich denke, die Antwort würde davon abhängen, wo Sie Ihre Daten speichern und wie schnell Sie sie dort übertragen können.

Wenn die Daten 44 MB groß sind und Sie sich in einem 1000base-T-Netzwerk befinden, können Sie davon ausgehen, dass 1 Sekunde tatsächlich übertragen wird. Und 1 Sekunde zurück zu übertragen.

Wenn Sie lokalen Speicher verwenden, dann haben Sie eine endliche Menge an Speicher der Maschine.

Wenn Sie eine Festplatte verwenden, haben Sie Lade-/Speicherzeiten (Festplatte ist langsam).

Aber denken Sie auch daran, PHP hat eine endliche Menge an Speicher, die ein Skript verwenden kann. Ich denke, die Standardeinstellung ist 8 MB.

Wenn Sie über große Datenblöcke sprechen, möchten Sie möglicherweise Redis, oder andere Schlüssel/Wert-Speicher berücksichtigen. Oder sogar eine Backend-Schnittstelle, um die Daten zu bearbeiten/zwischenzuspeichern, ohne sie über PHP zu übertragen.

0

Mmm, knifflig. Ich denke du könntest es in der Session speichern. Die eigentliche Frage lautet: Möchten Sie, dass all diese Informationen bei jeder Anfrage eines Clients serialisiert und deserialisiert werden? Ich denke, es wäre in Ordnung, es dort zu speichern, wenn Sie alle diese Informationen auf jeder Seite Ihrer Website verwenden, aber das ist unwahrscheinlicher. Es wäre besser, wenn Sie diese Informationen in einem Verzeichnis wie /temptables/sometable/ speichern und jede Datei den Namen der Sitzung hat.Sie können session_id verwenden, um es zu bekommen, und speichern und die Informationen auf den Seiten laden Sie mit verwenden:

$info = unserialize(file_get_contents('/templatebles/sometable/'.session_id().'.ser')); 

und Speichern mit:

file_put_contents('/temptables/sometable/'.session_id().'.ser'), serialize($info)); 

Aber Sie brauchen einen cron Job, der reinigen Verzeichnis für alte Datei. Sie können die Sitzung aus dem Dateinamen holen und nach einer Variablen wie 'itsalive' fragen, indem Sie session_start() verwenden oder so etwas wie file_exists(session_save_path().'/sess_'.$session_name) machen, um zu prüfen, ob Sie die temporäre Datei löschen sollen.

Verwandte Themen