2013-04-20 19 views
7

Szukam "drogi do pracy" (tj. Najbardziej wydajnego, najczęściej używanego, ogólnie przyjętego sposobu), jeśli chodzi o ponowne ładowanie danych z serwera WWW do frontowy koniec. W końcowej aplikacji, będę mieć kilka pól wyjściowych, gdzie dane muszą być na piśmie, na przykład tak:Efektywne przeładowywanie danych/przesyłanie danych z serwera do klienta

enter image description here

Strumienie danych będzie inny od siebie we wniosku końcowym. Linie będą musiały zostać ponownie załadowane świeżymi, aktualnymi danymi z serwera.

Myślałem o używaniu żądań Ajax do aktualizacji jak co sekundę, ale musi być inny sposób na zrobienie tego. Żądania Ajax spowodują duży ruch danych. Ponadto, podczas korzystania z czatu na Facebooku, nie musisz czekać co sekundę, czaty są odbierane niemal natychmiast. Jednak nie widzę żadnych żądań ankietowania Ajax, gdy używam narzędzi programistycznych Mozilli Firefox. To sprawiło, że pomyślałem, czy byłoby inaczej.

Zajrzałem do pliku Node.js, ale wydaje się, że nie jest to możliwe z moim hostem.

Słyszałem, że ludzie mówią o Ajax Push, czy to powinienem użyć? Jeśli tak, czy możesz podać mi przykład użycia podstawowego?

Jeśli nie, to co byłoby , a następnie być sposobem, aby przejść, mając wiele strumieni danych, które muszą być ponownie załadowane w ciągu sekundy?

Wymagania są następujące: prędkość i niski ruch danych. Dlatego nie byłoby opcji ciągłego odpytywania serwera, jak sądzę, ponieważ spowodowałoby to ogromne obciążenie.

Nie sądzę, że to ma znaczenie, ale używam PHP5.3 na zapleczu i JavaScript z jQuery 1.9.1 w interfejsie użytkownika.

Odpowiedz

8

To pytanie zostało zadane kilka razy, ale w nieco inny sposób. Oto kilka odnośników, które są warte odczytu:

Podsumowując: jeśli szukasz na budowa yo rozwiązanie za pomocą PHP na Apache, a następnie utrzymywanie otwartych trwałych połączeń (długich rozmów lub przesyłania strumieniowego HTTP) będzie zużywać zasoby bardzo szybko (jest wysoce nieefektywne). Więc lepiej byłoby użyć hosted solution (* disclaimer - pracuję dla hostowanego rozwiązania).

Długie odpytywanie HTTP i przesyłanie strumieniowe HTTP to rozwiązania, które zostały zastąpione przez zdarzenia wysłane przez serwer i witryny sieci Web. Jeśli to możliwe (jeśli klient sieci zapewnia wsparcie), powinieneś użyć jednego z tych rozwiązań, zanim powrócisz do rozwiązania opartego na HTTP. Dobra technologia internetowa w czasie rzeczywistym automatycznie obsłuży to za Ciebie.

Ponieważ Twój diagram pokazuje, że subskrybujesz wiele strumieni danych, powinieneś również rozważyć rozwiązanie, które naturalnie pasuje do tego. Ponownie, dobre rozwiązanie internetowe w czasie rzeczywistym zapewni ci to.

Zobacz także realtime web technology guide.

+1

+1 Śledzenie tych informacji zabrało mi trochę czasu na projekt, który niedawno opublikowałem. Nie miałem doświadczenia w tworzeniu stron internetowych i byłem zaskoczony, że przekazywanie danych z serwera do przeglądarki było tak rzadkie. –

2

Myślę, że to, czego szukasz, jest ogólnie nazywane Comet. Ta technika jest często wykonywana w następujący sposób:

  • Klient (przeglądarka internetowa) wysyła do serwera żądanie nowych danych. To nie jest ponowne ładowanie strony, ale raczej odbywa się w JavaScript
  • Serwer odpowiada na żądanie, gdy ma jakieś dane dla klienta. Ponownie, nie ma to wpływu na interfejs użytkownika, ponieważ nie jest to sama strona, która jest przeładowywana: w danych kodu JavaScript loaindg danych odbywa się "w tle".
  • Po stronie serwery żądanie czeka na nowe dane i zwraca nowe dane, gdy są dostępne, lub nie zwraca nic, jeśli zostanie osiągnięty limit czasu (zdefiniowany na serwerze). Ten limit czasu jest zwykle ustawiony na mniejszy niż limit czasu HTTP przeglądarki. Powodem tego jest to, że serwer wie, czy dany klient ma konkretny fragment danych. Jeśli żądanie może przekroczyć limit czasu po stronie klienta, serwer może odpowiedzieć na pierwotne żądanie po upływie limitu czasu klienta, a klient nie otrzyma danych, mimo że serwer uważa, że ​​tak się stało.

Dane są zwykle przesyłane jako JSON, ale można wybrać dowolne kodowanie. Zobacz here, aby dowiedzieć się, jak to zrobić. Goosh to kolejny przykład tej techniki, podobnie jak Interactive Python Shell. Kod dla wszystkich jest dostępny.


Po stronie PHP należy utworzyć stronę, która będzie odpowiadać na te "tła" żądań JavaScript Comet. Może to być ta sama strona, którą użytkownik ładuje, ale załóżmy, że jest inna, dla ułatwienia wyjaśnienia. Użytkownik ładuje więc index.php i wywołuje kod JavaScript Comet getNewData.php w celu pobrania nowych danych.

W twoim getNewData.php będziesz chciał poczekać na swoje wydarzenie i następnie je odesłać. Nie chcesz używać do tego odpytywania, ale istnieją biblioteki PHP, które pozwalają na używanie różnych strategii komunikacji między procesami do oczekiwania na zdarzenia, zobacz this question for instance. Pseudokod wysokim poziomie dla getNewData.php będzie wyglądać następująco:

  1. parse prośba JSON
  2. Wprowadź sprawny stan oczekiwania (z timeout), czekając na „nowe dane są dostępne” zdarzenie
  3. Czy poprzednie wydłużyć czas?
    Tak: wysłać odpowiedź wskazuje na brak danych
    nr: wysłać odpowiedź z nowymi danymi
+0

Chociaż ta odpowiedź jest poprawna pod względem technicznym, zaleca ona przestarzałe i nieskuteczne rozwiązanie, lepiej rozwiązane przez nowsze technologie. Comet jest terminem parasolowym dla hackowania HTTP, aby osiągnąć żądaną funkcjonalność. HTML5 wprowadził [Zdarzenia wysłane przez serwer] (http://en.wikipedia.org/wiki/Server-sent_events) i [WebSockets] (http://en.wikipedia.org/wiki/WebSocket), aby te hacki nie były już pierwszy port w celu rozwiązania tego typu problemów. Dodatkowo, podejście do długich odpowiedzi (opisane w tej odpowiedzi) na serwerze PHP będzie wysoce nieefektywne. – leggetter