Wpis z mikrobloga

#programowanie #php #webdev jak zaprojektowalibyście funkcjonalność "ostatnio oglądane" biorąc pod uwagę to, że użytkownik może otworzyć równoczeście wiele zakładek?

Ja to zrobiłem tak, że do sesji zapisałem tablicę z kolejnymi rekordami i usuwam duble jesli juz bylem na danej podstronie. Problem pojawia się w momencie otwarcia wielu zakładek jednoczesnie bo sesja zaczyna wariowac i sie nadpisywac zakladka po zakladce (tzn wszystko jest ok jak wczytuja sie z kilkusekundowym odstepem). Macie na to jakis pomysl? Probowalem session_commit i session regenerate i troche pomoglo, ale problemu nie rozwiazalo.
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@TheFuckingRoses:

Sprawdzales jakie masz I/O na serwerze..? Moze dyski sie dlawia? To wspoldzielony hosting? Masz pelna wladze nad serwerem? Mozna zrobic taki myk zeby na poziomie os utworzyc ramdysk i sesje php trzymac wlasnie na takim dysku.

Duzo zalezy od tego jak wyglada cel srodowisko, ilu masz userow etc.
  • Odpowiedz
@TheFuckingRoses: Baza nie jest wolnym rozwiązaniem. Ani mało wydajnym. No chyba, że źle jej używasz. Najwolniejszą opcją będzie często commitowanie sesji opartej o FS. (przy częstych zapisach trzeba sesje przenieść na jakiś ramowy storage: memcached, redis?)
  • Odpowiedz
@TheFuckingRoses: Też bym odradzał bazę danych, szkoda bazy na usera, który może już nigdy nie wrócić na stronę, można się co prawda bawić z czyszczeniem tego itd., ale po co? Może lepiej na ciastku, zamiast na sesji?

$_COOKIE['lastViewed'][] = $prodId;

$_COOKIE['lastViewed'] = array_unique($_COOKIE['lastViewed']);

Nie może nie działać ;). Na koniec jeszcze możesz sobie np. obcinać, tak aby trzymało tylko ostatnich 10 rekordów (czyli musisz brać albo ostatnie 10 z końca
  • Odpowiedz
@TheFuckingRoses: Kompletne rozwiązanie:

array_unshift($_COOKIE['lastViewed'], $prodId); //wrzucamy $prodId na poczatek tablicy

$_COOKIE['lastViewed'] = array_unique($_COOKIE['lastViewed']); //usuwamy
  • Odpowiedz
@TheFuckingRoses: No to najlepsze co zostaje, to baza danych. Zrób sobie primary key na productId i użyj INSERT IGNORE - jednym zapytaniem załatwisz problem duplikatów. Trzymanie max 10 rekordów per usera, to już będziesz musiał się pobawić z COUNT i DELETE ;).
  • Odpowiedz