2016-06-08 3 views
3

Hallo Ich habe eine Website mit Hunderten von TV-Shows und Zehntausenden von Episoden. Ich möchte, dass der Benutzer (der sich nicht angemeldet hat) seine Lieblingsshows speichern und die Folgen, die er beobachtet hat, markieren und diese Daten mit Cookies speichern kann.Beste Performance-Auswahl für Cookie-Arrays in PHP und JS?

Also ich habe es bereits in PHP und JS implementiert. Ich wollte nur wissen, was die beste Wahl ist, wenn es um Cookies geht.

Jetzt speichern ich die Daten in einem Cookie namens "Favoriten", das ist ein JSON-codiertes Array, das einfach die IDs der TV-Shows enthält. In dem Cookie 'überwacht' sind die IDs der Episoden, die der Benutzer als überwacht markiert hat.

Was ist die beste Option für Leistung und Speicher? Sie müssen bedenken, dass dies auch für Mobiltelefone gedacht ist. Wenn der Nutzer also Tausende von Episoden als überwacht markiert, möchte ich nicht, dass dies alles verlangsamt.

Der folgende Code ist kein echter Code, sondern dient nur dazu, Ihnen die Unterschiede zwischen den Optionen verständlich zu machen.

Option 1

ein Cookie 'angeschaut' genannt, das ein JSON codierte Array die IDs enthält, ist. Ich würde müssen überprüfen, ob das Array diesen Wert

$_COOKIE['watched'] = array(1,2,3,4,...) 

Mit dieser Option enthält, in der TV-Show Seite würde ich immer das gesamte Array holen muß und prüfen, ob jede einzelne Episode ID ein Wert im Array .

Option 2

ein Cookie für jede ID, genannt zum Beispiel "watched_ [ID]". Ich würde nur prüfen, ob es existiert oder nicht.

exists($_COOKIE['watched_1']) ? watched : !watched 
exists($_COOKIE['watched_2']) ? watched : !watched 

Option 3

ein Cookie aufgerufen 'angeschaut', die ein assoziatives JSON codierten Array ist ein Array für jede TV-Show, genannt zum Beispiel enthält 'angeschaut [show_ID]', und jeder von Diese enthalten nur die IDs der Episoden, die als überwacht markiert sind und zu dieser Show gehören. (So ​​in der TV-Show Seite, die ich zuerst prüfen ‚angeschaut [show_ID]‘ dann schon ich habe alle beobachteten Folgen, statt jede einzelne Episode ID mit dem Array zu vergleichen ‚angeschaut‘ von Option 1

$_COOKIE['watched'] = array(
       1 => array(1,2,3), 
       2 => array(4,5,6) 
) 
+0

Beachten Sie, dass andere Optionen möglich sind; z.B. ein Tracking-Cookie und serverseitiges Speichern oder Verwenden von LocalStorage und AJAX. Ich sage nicht, dass sie besser sind, aber ich sage nur, dass sie existieren. – JohannesB

+0

Seit dem Moment, in dem ich herausgefunden habe, dass JS Cookies bekommen und setzen kann, habe ich nie überlegt, AJAX zu benutzen, nur um einen Cookie zu checken. Warum sollte ich den Server stören, wenn ich das vermeiden kann? Jedenfalls habe ich die 3 Optionen notiert, die meiner Meinung nach am besten sind. Natürlich bin ich offen für jeden anderen Vorschlag, aber denken Sie daran, dass ich nicht nach der besten Option gefragt habe, um Cookies auf meiner Website zu behandeln. Ich fragte nach dem besten Weg, Daten in Cookies-Arrays zu verarbeiten. –

+0

Der AJAX wird dann ausschließlich zum Rendern Ihrer Seite verwendet und dient zum Generieren dynamischer Inhalte basierend auf LocalStorage. – JohannesB

Antwort

2

Der von Ihnen ausgewählte Ansatz hängt ausschließlich von der Art der Benutzer ab. Wenn die Datengröße in Ihrem Fall in der Regel groß ist, sollten Sie mit Option 3 gehen, da assoziative Arrays eine gute Lösung für große Datenmengen darstellen

Wenn Ihr Benutzerdatensatz ziemlich klein ist, dann ist Option 2 der beste Ansatz, da wir für jede Sendung unterschiedliche Cookies haben und Sie sofort die entsprechenden Werte überprüfen können .

Weiter möchte ich Sie durch die html5 API gehen, um indexed db als eine Lösung für Ihr Problem zu verwenden, da es Client-Seite-DB bietet und weiter ist es eine persistente Datenbank. Hoffe, das hilft

+0

Es hat sehr geholfen, vielen Dank. Da der Benutzer die Möglichkeit hat, jede Show als Favorit und jede Folge als gesehen zu setzen, wähle ich Option 3. –

+0

Danke Ernie :) – kshitij

0

Etwas, das nicht in der angenommenen Antwort adressiert wird, ist Browser Cookie-Einschränkungen (auf der Client-Seite der Dinge).Option 2 funktioniert eindeutig nicht wegen der Begrenzung der Anzahl von Cookies erlaubt:

Browser    Num Cookies Size Per Cookie Size Per Domain 
-------    ----------- --------------- --------------- 
Chrome 8-25   180   4096 bytes   
FireFox 3.6.13-19 150   4097 characters 
IE 8/9/10    50   5117 characters 10234 characters 
Safari    600   4093 bytes   4093 bytes 
Android 2.1/2.3.4  50   4096 bytes 
Safari Mobile 5.1 600   4093 bytes   4093 bytes 

Einige dieser Zahlen veraltet sein können ... [source]

aber Sie müssen noch vorsichtig sein, wenn unter Verwendung von Optionen 1 oder 3 aufgrund der Größenbeschränkung pro Cookie/Domain. This fiddle zeigt an, wie groß ein assoziatives Array ist, wenn es 1000 Elemente mit einer Schlüssellänge von je 7 Zeichen enthält (etwa 12000 Byte).

Wenn Sie Tausende von Elementen in Cookies speichern möchten, müssen Sie wahrscheinlich eine Cookie-Wrapper-Bibliothek schreiben, die Ihre Daten auf mehrere Cookies verteilt, um die Größenbeschränkungen pro Cookie zu vermeiden.

+0

Vielen Dank für Ihre Antwort, ich hatte keine Ahnung, dass es ein Browserlimit für Cookies gab. Das ist sehr wichtig, und ich könnte es für die "Lieblings" -TV-Shows durch das Setzen eines Limits beheben. Ich kann keine Grenze für die beobachtete Episode setzen, da es Unsinn wäre ... danke, ich muss dann etwas anderes herausfinden. –

+1

Ich habe auch nicht darüber nachgedacht, bis ich einen einfachen Leistungstest für Option 2 geschrieben habe. Es hat nur 180 meiner 10.000 Cookies gespeichert! :) –

+0

Haha ja das ist definitiv keine gute Sache. Haben Sie schon einmal an eine Lösung gedacht, diese Grenze zu umgehen? Mein erster Gedanke ist jetzt, eine zufällige ID für den Benutzer zu generieren und sie als Cookie zu speichern und die der ID zugeordneten Favoriten in der Datenbank zu speichern. Es wird also 1 Cookie für den Benutzer sein, 1 Zeile Daten in meiner Datenbank ... wie hört sich das für Sie an? Auf diese Weise kann ich auch verfolgen, welche Shows beliebter sind. –