[PHP] Shoutbox

0

Witam,

chwile temu stworzyłem prostego shoutbox'a.
Całość jest na bazie danych. Odświeżanie co 2 sekundy.

Wyświetlanie danych z widzenia bazy danych:

  • Kasuje wszystkie wpisy starsze niż 1 godzina.
  • Pobieram dane z limitem do 30 wierszy.

Zapis tekstu:

  • Sprawdzam czy użytkownik nie ma bana, jeśli nie ma to:
  • Zwykły insert danych

A teraz pytanie - czy przy 100 (lub więcej) użytkownikach na SB nie będzie problemu z wydajnością bazy?
Nie chciałbym, żeby admin mnie zablokował ;)

Tak naprawdę całość umieściłem w bazie ze względu na łatwą moderację tekstów.
Jeśli ktoś spamuje albo wpisał jakiś wulgaryzm itd. to mogę skasować odpowiedni wiersz z bazy w łatwy sposób. Mając dane w pliku byłoby to trochę utrudnione.

Zostawić całość jak jest czy zamieniać na pliki?

0

<Quote>Całość jest na bazie danych. Odświeżanie co 2 sekundy.</quote>
No wai. Nie można z 10 sekund dać?

0

A takie pytanie.:) po co to kasowanie wpisów starszych niz godzina?:) wg mnie to troche nie bardzo rozwiazanie bo zalozmy ze ktos da wpis o jakas pomoc i nikt nie odpisze, w tym momencie wpis sie kasuje. User widzi ze nie ma jego wpisu i dodaje kolejny itd. Moderator widzi ze ktos dodal kilka wpisów takich samych i co? Banuje go?:)
Wg mnie to nie jest dobre rozwiazanie.

0

Dzięki djgarsi! Przemyślałem to.

Doszedłem do wniosku, że zamiast kasować wpisy co godzinę będę kasował je po dodaniu nowego.
Polecą wszystkie o id <= max(id) - 100.

Wyświetlam tak czy inaczej 30 wierszy.
Ale przechowując starsze wpisy zapewniłem sobie możliwość ciągłości SB.
Tzn. jeśli ktoś będzie spamował i system lub moderator to wychwyci wtedy dodaje użytkownika do listy zbanowanych i usuwa wszystkie wpisy tego użytkownika.
Wtedy zamiast spamu pojawią się wpisy, które być może ktoś chciał przeczytać.

Co do wpisywania tego samego tekstu:
sprawdzam, czy użytkownik nie wpisywał takiego tekstu.
Jeśli wpisał to pokazuję mu info, ze nie da rady wysłać dwa razy tego samego.
Tak samo nie może wysłać wiadomości krótszej niż 3 znaki.

Obecnie całość wygląda trochę lepiej z punktu widzenia wydajności.

Wyświetlanie danych:

  • Pobieram dane z limitem do 30 wierszy.

Zapis danych:
Jeśli tekst nie jest pusty to:

  • Sprawdzam czy użytkownik nie ma bana, jeśli nie ma to:
  • Sprawdzam czy tekst się nie powtórzył lub czy nie jest za krótki, następnie:
  • Sprawdzam czy wśród 30 ostatnio dodanych postów przynajmniej 20 nie było tego user'a. Jeśli tak to ban albo mute. W przeciwnym razie:
  • Zwykły insert danych

W ten sposób mam tylko jeden select do bazy przy wypisywaniu danych, co poprawia już wydajność.
Co prawda sprawdzanie czy czy 20/30 postów było autorstwa danego użytkownika nie musi być kontretnie spamem. Ale podchodzi pod flood ;)

Mam jeszcze jedno pytanie:
Zna ktoś sposób na złamanie długiej linii?
Mam problem z tym, jak ktoś wpisze ciąg 100 znaków bez spacji. Nie mieści się to w oknie.

0

A może zastosuj http://en.wikipedia.org/wiki/Comet_(programming) ?

Tzn przy połączeniu pobierz 30 rekordów, następnie serwer nie zamyka połączenia, ale wysyła kolejne shouty JSONem, które są łapane jako zdarzenia AJAXowe. Przy banie można wysłać specjalną wiadomość, z nazwą zbanowanego nicka i usunąć go z przegląrdarki JavaScriptem. Wszystkie shouty od momentu połączenia przeglądarki powinny być gdzieś przechowywane (cache). Dopiero jak ilość przechowywanych shoutów zmniejszy się do < 30, w konsekwencji banów, to wtedy np nawiązujemy nowe połączenie.

Problemem jest stworzenie systemu eventów na serwerze (tak, żeby wysyłać nowe shouty bez zbędnych zapytań do bazy). W sumie to każda instancja interpretera powinna mieć takie samo cache jak w przegląrdarce klienta plus jedna globalna (na cały serwis) lista shoutów które powinny być wyświetlane. Wtedy w każdej instancji porównywane byłyby te cache z tą listą i wysyłałoby się diffa do klienta.

:)

Zna ktoś sposób na złamanie długiej linii?
Mam problem z tym, jak ktoś wpisze ciąg 100 znaków bez spacji. Nie mieści się to w oknie.

Sprawdź czy w pierwszych x znakach ze stringa jest spacja. Jeśli nie to go podziel i później sklej z dodatkową spacją w środku. Oczywiście zapuść procedurę rekurencyjnie dla drugiej części stringa (bo też może być dłuższa niż te x znaków).

0

Ojoj ciężko będzie :P

No nic poczytam i zobaczę.

Co do długiej linii to napisałem funkcje, która mi sprawdza czy jedno z wielu słów nie przekroczyło X znaków. Jeśli przekroczyło to alert do usera ze za długie słowo. Ustawiłem 70 znaków. Raczej nie będzie nikt takich używał :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1