Trwałość koszyka: $ SESSION czy cookie przeglądarki?

W witrynie e-commerce bez nazwy użytkownika/loginu do utrzymywania danych koszyka, czy lepiej byłoby użyć zmiennej PHP $_SESSION lub pliku cookie przeglądarki do utrzymywania pozycji w Koszyku? Skłaniam się ku $_SESSION, Ponieważ pliki cookie można wyłączyć, ale chciałbym usłyszeć myśli od Ciebie.

Z góry dziękuję za uwagę.

Author: Xeoncross, 2012-09-24

6 answers

Ani

Żadne duże witryny nie odważyłyby się przechowywać koszyka użytkownika w sesji lub pliku cookie - te dane są po prostu cenne.

Co klienci kupują, kiedy wybierają przedmioty, ile kupują, dlaczego nie kończą kasy itp.. są bardzo, bardzo ważne dla Twojego biznesu.

Użyj tabeli bazy danych, aby zapisać te informacje, a następnie połączyć je z sesją użytkownika. W ten sposób nie stracisz informacji i możesz wrócić i tworzyć statystyki na podstawie koszyków użytkowników lub rozwiązywania problemów z procesem realizacji zakupu.

Zapisuj wszystko, co możesz.

Schemat Bazy Danych

Poniżej znajduje się uproszczony przykład tego, jak może to wyglądać na poziomie bazy danych.

user {
    id
    email
}

product {
    id
    name
    price
}

cart {
    id
    product_id
    user_id
    quantity
    timestamp    (when was it created?)
    expired      (is this cart still active?)
}

Możesz również podzielić tabelę koszyka na więcej tabel, aby móc śledzić zmiany w Koszyku.

Sesje

Zwykłe sesje PHP składają się z dwóch części

    Dane (przechowywane w pliku na serwerze)
  1. unikalny identyfikator nadany agentowi użytkownika (przeglądarce)

Dlatego nie jest $_SESSION vs $_COOKIE - jest $_SESSION + $_COOKIE = "sesji". Istnieją jednak sposoby modyfikacji tego za pomocą pojedynczego zaszyfrowanego pliku cookie, który zawiera dane (i dlatego nie potrzebujesz identyfikatora, aby znaleźć dane). Innym powszechnym podejściem jest przechowywanie danych w memcached lub bazie danych zamiast systemu plików, aby wiele serwerów miało do nich dostęp.

@ Travesty3 mówi, że ty może zawierać dwa pliki cookie-jeden dla sesji, a drugi, który jest albo" keep me logged in " cookie (który istnieje dłużej niż plik cookie sesji), lub kopię danych wewnątrz oddzielnego pliku cookie.

 42
Author: Xeoncross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 18:20:15

Jak zauważył Xeoncross, bardzo ważne jest przechowywanie wszelkich możliwych informacji do analizy. Nie należy więc całkowicie polegać na sesjach i Plikach cookie.

Możliwe podejście to -

Używaj sesji jeśli nie jesteś zalogowany

Jeśli Użytkownik nie jest zalogowany, możesz przechowywać i pobierać elementy koszyka i elementy listy życzeń z sesji za pomocą $_SESSION w PHP

Użyj bazy danych po zalogowaniu

Jeśli użytkownik jest zalogowany to można rozważyć jeden z dwie opcje -

  • przechowuj element koszyka lub pozycję listy życzeń w samej bazie danych
  • przechowuj element koszyka lub pozycję listy życzeń w bazie danych, a także w sesji (spowoduje to zapisanie niektórych zapytań do bazy danych)

Kiedy użytkownik loguje się

Gdy użytkownik się loguje, Pobieraj wszystkie elementy koszyka i listy życzeń z sesji i przechowuj je w bazie danych.

To sprawi, że dane będą trwałe, nawet jeśli użytkownik wyloguje się lub zmieni maszynę, ale do użytkownik nie jest zalogowany, nie ma możliwości przechowywania informacji na stałe, więc nie będą trwałe.

Pobieranie wymaganych danych

Gdy próbujesz uzyskać dostęp do koszyka lub listy życzeń, wykonaj następujące sprawdzenie -

  • Jeśli Użytkownik nie jest zalogowany, zajrzyj do sesji
  • Jeśli użytkownik jest zalogowany, odpytywaj bazę danych, jeśli przechowujesz ją tylko w bazie danych, w przeciwnym razie możesz po prostu zajrzeć do sesji, jeśli utrzymujesz aktualizację sesji wraz z baza danych
 6
Author: MukeshD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 06:58:02

Zapisałbym to w sesji. Moja lista życzeń jest dość długa i obawiam się, że nie zmieści się ona w pamięci 4K, którą może zajmować plik COOKIE. Wymusza to ustawienie czasu sesji na dłuższy okres.

Uwaga: w niektórych krajach (takich jak Holandia, gdzie jestem) obowiązują bardzo rygorystyczne zasady dotyczące plików cookie, a prawo może zmusić cię do korzystania z sesji.

 5
Author: JvdBerg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:00:29

Możesz rozważyć użycie obu.

Wadą $_SESSION jest to, że sesja jest usuwana po zamknięciu przeglądarki.

Użyj sesji, ale spróbuj wypełnić dane $_SESSION z pliku cookie, jeśli są dostępne.

 3
Author: Travesty3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:16:32

Kilka punktów do pomocy:

Cookies:

  • informacje są przechowywane do momentu wygaśnięcia pliku cookie (co może być skonfigurowane przez Ciebie);
  • mają tendencję do spowolnienia komunikacji między serwerem a klientem, ponieważ musi być wymieniana między nimi w każdym zapytaniu / odpowiedzi;
  • Jest to niebezpieczna forma przechowywania danych i łatwa do powąchania;]}
  • mają również limit do przechowywania danych.

Sesja:

  • wszystkie informacje są przechowywane w serwera, więc nie zostały wymienione z klientem.
  • Ponieważ nie jest współdzielony w sieci, jest nieco bezpieczniejszy;
  • wszystkie informacje są tracone po zakończeniu sesji;
  • jeśli hostujesz na współdzielonym hoście, możesz mieć problemy z zakończeniem sesji w środku operacji z powodu wypychania zasobów przez dowolną witrynę hostowaną na tym samym serwerze.

Osobiście wybrałbym sesje, ponieważ zakładam, że jest to mała / meddium auddience strona. Jeśli to rośnie, lepiej byłoby mieć prostą strukturę DB do przechowywania tych danych, z planem konserwacji, aby uzyskać grzbiet niepotrzebnych danych (np.: klienci, którzy wybierają niektóre produkty, ale nie robią kasy).

 2
Author: rcdmk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:22:38

Przydałaby mi się sesja. Jeśli użytkownik ma wyłączone pliki cookie, sesja nie będzie mogła się rozpocząć, ponieważ identyfikator sesji jest przechowywany na komputerze użytkownika w pliku cookie.

Istnieją pewne ustawienia, na które warto spojrzeć, aby spróbować utrzymać sesje na dłużej.

  • Zapobiec usunięciu pliku cookie sesji, gdy użytkownik zamknie przeglądarkę, uruchamiając session_set_cookie_params() z parametrem lifetime. Ta funkcja musi być uruchomiona przed session_start()

  • Możesz również rozszerzyć częstotliwość czyszczenia sesji z serwera, modyfikując ustawienia usuwania śmieci sesji session.gc_probability, session.gc_divisor, session.gc_maxlifetime albo w php.ini lub za pomocą ini_set()

  • Jeśli masz inne strony internetowe uruchomione na serwerze i zmodyfikujesz powyższe ustawienia garbage collection będziesz potrzebował ich ustawić w php.ini więc mają zastosowanie do wszystkich stron internetowych, lub jeśli używasz ini_set() to możesz również spojrzeć na zapisywanie tych sesji do innego katalogu niż inne strony internetowe poprzez modyfikację session_save_path(). Ponownie jest to uruchamiane przed session_start(). Zapobiegnie to zbieraniu śmieci z innych witryn usuwających rozszerzone sesje dla jednej konkretnej witryny.

  • Polecam również ustawienie następujących ustawień sesji w php.ini session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512. To powinno dać ci kryptograficznie silny identyfikator sesji z bardzo małą szansą na kolizję.

  • I upewnij się, że masz certyfikat SSL na Twojej witryny, aby zapobiec atakom man in the middle na Twój identyfikator sesji.

Oczywiście użytkownik może nadal zdecydować się ręcznie wyczyścić wszystkie swoje pliki cookie, które będą zabierać plik cookie z identyfikatorem sesji, ale to ryzyko, które byłbym gotów podjąć. Gdybym był w połowie systemu koszyka na zakupy i nie wymeldował się, nie poszedłbym i wyczyścić moje ciasteczka. Nadal uważam, że sesje są lepsze niż zwykłe ciasteczka.

Dane są wystarczająco bezpieczne, dopóki jesteś jedynym strona, która ma dostęp do katalogu sesji i ID sesji jest silna. Wydłużając czas przechowywania sesji serwera, Twoje dane mogą być przechowywane na serwerze.

Istnieją dalsze środki, które możesz zastosować, aby Twoje sesje były jeszcze silniejsze. Regeneruj swój identyfikator sesji co 20 minut, kopiując dane. Zapisuj również identyfikatory sesji względem adresów IP w bazie danych i sprawdź, czy dany adres IP próbuje wysłać więcej niż X liczby identyfikatorów sesji w danej bazie danych czas zapobiec komuś, kto próbuje brutalnie wymusić identyfikator sesji.

Można również przechowywać dane w bazie danych połączonej przez identyfikator sesji, zamiast w pliku sesji na serwerze. Jednak nadal zależy to od identyfikatora sesji, który jest przechowywany w pliku cookie i może zniknąć w dowolnym momencie. Jedynym sposobem, aby naprawdę mieć pewność, że użytkownik nie straci koszyka, jest zalogowanie się najpierw i przechowywanie w bazie danych.

 2
Author: batfastad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 22:25:12