Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]Powiadomienie użytkownika o jakiejś akcji
Forum PHP.pl > Forum > Przedszkole
Mlodycompany
Witam. Męczy mnie ostatnio jedna rzecz. Chodzi mi o powiadomienia takie np. jak są na facebook np. jak znajomy doda komentarz do mojego zdjęcia. Wyskakuje okienko z tą informacją. Wszystko jest bez przeładowania. Pomyślałem trochę i doszedłem do wniosku że można zrobić tabele w mysqlu i jak ktoś wykona odpowiednią akcje to dodaje się powiadomienie i odpalić skrypt w js który by sprawdzał co np. 2 sekundy czy są jakieś nowe i zależnie od wyniku wyświetlał na stronie. Ale gdy 1000 ludzi odpali taki skrypt to zrobi się kombajn i obciąży serwer. Macie jakiś inny pomysł jak to zrobićquestionmark.gif
kipero
Innej opcji nie ma - skrypt musi "odpytać" serwer, czy są jakieś powiadomienia dla użytkownika. Musisz napisać takie rozwiązanie, a później po stronie serwera pobawić się w optymalizację(może zastosujesz jakiś system cache).
Mlodycompany
a o co kaman z tym cache. jakoś nigdy nie rozkminiałem tego. Możesz dać jakiegoś linka do dobrej lektury?
Mlodycompany
Witam ponownie. Opracowałem skrypt powiadomień. Na pierwszy rzut oka działa ładnie.. ale nie dokońca. Przedstawie moje wypociny a potem opowiem o problem.
plik load.php
  1. if($_GET['func'] == 'powiadomienia'){
  2. $zmien = new zmien();
  3. $query = mysql_query("SELECT * FROM `powiadomienia` WHERE `odbiorca` = '0' OR `odbiorca` = '".$_SESSION['id']."' ORDER BY `time` ASC");
  4. while($row = mysql_fetch_array($query)){
  5. preg_match('#\((.*?)\)#', $row[1], $pow);
  6. $pow = str_replace('('.$pow[1].')', $zmien->returnLogin($pow[1]), $row[1]);
  7. echo('<div class="powiadomienie_'.$row[2].'">'.$pow.'</div>');
  8. $del = mysql_query("DELETE FROM `powiadomienia` WHERE `id` = '".$row[0]."' LIMIT 1");
  9. }
  10. }

  1. function powiadomienia(){
  2. $('#action').load('load.php?func=powiadomienia', function(data){
  3. if(data != ''){
  4. $('#powiadomienia').html(data);
  5. }
  6. });
  7. setTimeout(function(){ powiadomienia(); },1500);
  8. }

funkcja powiadomienia() rozpoczynana jest po wczytaniu indexu. Problem polega na tym, że gdy zakomentuje linie 8 w load.php to wyświetla na stronie wszystkie powiadomienia jakie dochodzą czyli wzasadzie działa jak powinno tylko tyle, że nie są usuwane, ale gdy linia 8 nie jest zakomentowana no to już inna bajka. Powiadomienia raz dochodzą raz nie. Kompletnie nie wiem dlaczego. Co o tym myślicie? Proszę o pomoc. smile.gif
thek
A pomyślałeś, że może dojść do sytuacji, że odpytanie serwera czasem może zająć dłużej i nadejdą 2 lub 3requesty zanim serwer odpowie, przez co szybciej się one skasują niż zdążą być wysłane. Zwiększ wartość z 1500 na znacznie wyższa a powinno wszystko się unormować. Widać, że nie zwracasz uwagi na środowisko, gdzie mogą być skrypty uruchamiane. Nieraz między wysłaniem requesta a jego odbiorem może minąć wiele sekund. Ja bym nie schodził tutaj z wartościami poniżej 10-15tysięcy milisekund dla pewności. 1500 to stanowczo za mało na serwerach produkcyjnych. Będzie on zasypany requestami zwyczajnie. Pomyśl o lepszej optymalizacji smile.gif
yevaud
mozna nie odpytywac, tylko zestawic stabilne polaczenie http(HTTP Streaming). Tzn. klient odpytuje jakis adres http z ustawionym bardzo dlugim timeout, serwer lyka request ale odpowiada i zamyka polaczenie dopiero wtedy gdy zachodzi jakas zmiana na serwerze. Niezlym wyjsciem jest tez flash->socket, ale piszemy w dziale js.
Generalnie wtedy nie spamujesz serwera tysiacem requestow "co nowego", zestawiasz jedno polaczenie ktore zamykasz wtedy gdy jest jakas nowosc, wtedy mozesz otworzyc je znow. Z tego co pamietam facebook chat dziala wlasnie na tej zasadzie

edit: podobno niektorzy nie zamykaja polaczenia w ogole tylko "flushuja" dane w miare tego jak pojawia sie cos nowego, ale ja mialem z tym jakies klopoty i robilem po prostu reset polaczenia po tym jak serwer "pushowal"
Mlodycompany
Jeżeli chodzi o optymalizacja w tym przypadku to nie jest mi ona potrzebna. Robię skrypt czatu tak poprostu, żeby usiąść z ziomkami i coś obgadać. A co do problemu. Otóż "przespałem" się z nim i doszedłem do wniosku, że jak więcej osób ma otwarty ten czat to u jednej osoby powiadomienie wyskakuje i się odrazu z bazy usuwa i w tym momencie nie jest już dostępne dla reszty. W tym tkwi problem.
#luq
Cytat(Mlodycompany @ 20.08.2010, 10:53:01 ) *
doszedłem do wniosku, że jak więcej osób ma otwarty ten czat to u jednej osoby powiadomienie wyskakuje i się odrazu z bazy usuwa i w tym momencie nie jest już dostępne dla reszty

No bo nie możesz usuwać tych danych zaraz po odebraniu przez któregoś z rozmówców. Musisz przetrzymywać te dane do określonego momenty czasowego (nie starsze niż 1dzień) lub ilościowego (1000 ostatnich rekordów). Wyobraź sobie przypadek, że 3 rozmawia 5min i po tym czasie dołącza się 4 osoba, powinna ona widzieć ten tekst z przed 5min. prawda?

Co do rozwiązania, ostatnio pokazano mi takie cudo jak Ajax Push Engine stosujący model komunikacji Comet. Szczerze to jeszcze nie miałem czasu się tym pobawić, ale chyba najlepiej na jego podstawie pisać takie rozwiązania. TU jest jakiś post na temat APE smile.gif
thek
A skoro jesteśmy przy jakichś ciekawych technologiach, to może wspomnę o WebWorkers i WHATWG. Ogólnie technologii ciekawych jest kilka. Z takich oprócz Comet można wyróżnić WebWorkers i choćby Gears. Ten ostatni jednak trzeba zainstalować w systemie, ale pozwala zwiększyć responsywność przeglądarki znacznie gdy operujemy na dużych zestawach danych.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.