Przejdź do głównej treści
Grafika przedstawia ukryty obrazek

Long Polling vs. Short Polling: Porównanie

Obraz ilustrujacy Long Polling vs Short Polling Porwnanie

Long Polling

Zasada działania

Klient wysyła zapytanie do serwera, a serwer utrzymuje to połączenie otwarte do momentu, aż będzie miał nowe dane do wysłania. Po odebraniu odpowiedzi klient natychmiast wysyła kolejne zapytanie.

Zalety

  • Niskie zużycie zasobów serwera:
    Połączenie utrzymywane jest tylko do momentu, gdy są dostępne nowe dane, co zmniejsza liczbę niepotrzebnych zapytań.
  • Niższe opóźnienia w dostarczaniu danych:
    Dane są dostarczane w momencie ich dostępności, co zapewnia prawie natychmiastową aktualizację.
  • Brak stałego połączenia:
    Działa na tradycyjnym HTTP bez potrzeby stosowania protokołów takich jak WebSocket.
  • Prostsza implementacja w porównaniu z WebSocketami:
    Można zaimplementować w środowiskach, które nie wspierają bardziej zaawansowanych technologii.

Wady

  • Dłuższy czas oczekiwania:
    Klient może czekać na odpowiedź nawet przez kilka sekund, co w niektórych przypadkach jest nieefektywne.
  • Ograniczenia skalowalności:
    W dużych aplikacjach może powodować problemy z obciążeniem serwera ze względu na utrzymywanie dużej liczby połączeń jednocześnie.
  • Timeouty:
    Długie oczekiwanie może wymagać dodatkowej obsługi timeoutów po stronie klienta i serwera.

Praktyczne zastosowania

  • Aplikacje typu chat: Natychmiastowa aktualizacja wiadomości w rozmowie.
  • Powiadomienia w czasie rzeczywistym: Alerty o zdarzeniach, np. zmiana statusu zamówienia.
  • Systemy monitorowania: Śledzenie zdarzeń na bieżąco (np. zmiany stanu systemu).

Przykładowy kod

Kod po stronie klienta

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Long Polling Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="messages"></div>

    <script>
        function startLongPolling() {
            $.ajax({
                url: "long_polling.php", // Ścieżka do skryptu PHP
                method: "GET",
                dataType: "json",
                success: function(response) {
                    if (response.success) {
                        $("#messages").append(`<p>${response.message}</p>`);
                    }
                    // Kontynuuj polling
                    startLongPolling();
                },
                error: function() {
                    console.error("Błąd podczas pobierania danych.");
                    // Ponów próbę po krótkim czasie
                    setTimeout(startLongPolling, 5000);
                }
            });
        }

        // Rozpocznij long polling
        startLongPolling();
    </script>
</body>
</html>

Kod po stronie serwera

<?php
// Ustawienia
set_time_limit(30); // Maksymalny czas działania skryptu (30 sekund)
$startTime = time();
$timeout = 25; // Czas oczekiwania na nowe dane (25 sekund)

// Funkcja symulująca sprawdzanie nowych danych
function checkForNewData() {
    // Przykład: Generowanie nowej wiadomości co kilka sekund
    $shouldSendData = rand(0, 1); // Zwraca 1 lub 0 losowo
    if ($shouldSendData) {
        return "Nowa wiadomość: " . date('H:i:s');
    }
    return false;
}

header("Content-Type: application/json");

while (true) {
    // Sprawdź nowe dane
    $newData = checkForNewData();

    if ($newData) {
        echo json_encode([
            "success" => true,
            "message" => $newData
        ]);
        exit;
    }

    // Przerwij pętlę, jeśli upłynął czas oczekiwania
    if (time() - $startTime > $timeout) {
        echo json_encode([
            "success" => false,
            "message" => "Brak nowych danych"
        ]);
        exit;
    }

    // Krótka przerwa, aby zmniejszyć obciążenie serwera
    usleep(500000); // 0.5 sekundy
}

Short Polling

Zasada działania

Klient cyklicznie wysyła zapytania do serwera w określonych odstępach czasu (np. co 1 sekundę), aby sprawdzić, czy są dostępne nowe dane.

Zalety

  • Prostota implementacji:
    Łatwe do zrozumienia i wdrożenia zarówno po stronie klienta, jak i serwera.
  • Niezależność od stanu połączenia:
    Nie wymaga utrzymywania otwartego połączenia przez dłuższy czas.
  • Brak problemów z timeoutami:
    Każde zapytanie jest niezależne, więc timeouty są mniej problematyczne.

Wady

  • Zwiększone obciążenie serwera:
    Duża liczba zapytań w krótkich odstępach czasu generuje znaczny ruch sieciowy i obciążenie serwera.
  • Większe zużycie zasobów klienta:
    Klient musi cyklicznie inicjować nowe zapytania, co może zwiększyć zużycie energii i zasobów urządzenia.
  • Opóźnienia w aktualizacjach:
    Nowe dane mogą być dostępne na serwerze tuż po zapytaniu klienta, ale zostaną odebrane dopiero przy następnym cyklicznym zapytaniu.
  • Marnowanie zasobów:
    Nawet gdy brak nowych danych, klient wciąż wysyła zapytania, co jest nieefektywne.

Praktyczne zastosowania

  • Synchronizacja danych w tle: Pobieranie zaktualizowanych danych w ustalonych interwałach, np. prognozy pogody.
  • Statystyki i raporty: Aktualizacja metryk w systemach analitycznych.
  • Proste systemy alertowe: Odpowiednie, gdy czas reakcji nie jest krytyczny.

Przykładowy kod

Kod po stronie klienta

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Short Polling</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h1>Short Polling z PHP</h1>
    <div id="messages">
        <h2>Otrzymane wiadomości:</h2>
        <ul id="message-list"></ul>
    </div>

    <script>
        // Funkcja do pobierania aktualizacji
        function fetchUpdates() {
            setInterval(() => {
                $.ajax({
                    url: 'server.php',
                    method: 'GET',
                    success: function (response) {
                        const data = response;
                        const messageList = $('#message-list');
                        messageList.empty(); // Czyszczenie listy
                        data.forEach(item => {
                            messageList.append(`<li>${item.id}: ${item.message}</li>`);
                        });
                    },
                    error: function (xhr, status, error) {
                        console.error('Błąd podczas komunikacji z serwerem:', error);
                    }
                });
            }, 5000); // Czas w milisekundach
        }

        // Uruchomienie funkcji Short Polling
        fetchUpdates();
    </script>
</body>
</html>

Kod po stronie serwera

<?php
// Plik server.php

// Symulowana lista wiadomości
session_start();
if (!isset($_SESSION['messages'])) {
    $_SESSION['messages'] = [
        ['id' => 1, 'message' => 'Pierwsza wiadomość'],
        ['id' => 2, 'message' => 'Druga wiadomość']
    ];
}

// Dodanie nowej wiadomości za każdym zapytaniem
$newMessage = [
    'id' => count($_SESSION['messages']) + 1,
    'message' => 'Wiadomość nr ' . (count($_SESSION['messages']) + 1)
];
$_SESSION['messages'][] = $newMessage;

// Zwrócenie danych w formacie JSON
header('Content-Type: application/json');
echo json_encode($_SESSION['messages']);
?>

Podsumowanie

Cechy Long Polling Short Polling
Efektywność Bardziej efektywny przy rzadkich aktualizacjach Mniej efektywny z powodu częstych zapytań
Opóźnienia Minimalne opóźnienia Opóźnienia zależne od interwału
Zasoby serwera Większe obciążenie w przypadku wielu klientów Stałe obciążenie niezależne od dostępności danych
Implementacja Nieco bardziej skomplikowana Prosta w implementacji

Wybór metody

  • Long Polling sprawdza się, gdy potrzebne są natychmiastowe aktualizacje (np. chat, powiadomienia).
  • Short Polling jest odpowiednie, gdy nowe dane są generowane w przewidywalnych odstępach czasu, a opóźnienia nie są krytyczne.
21 stycznia 2025 26

Kategorie

programowanie

Dziękujemy!
()

Powiązane wpisy

Ilustracja tematu Wyraenia regularne i ich obsuga w PHP oraz JavaScript
1 lutego 2025 5 min 19

Wyrażenia regularne i ich obsługa w PHP oraz JavaScript

Czytaj więcej
Grafika przedstawia Jak zrealizowa dwukierunkowe wizanie danych MVVM w Vanilla JS
2 lutego 2025 3 min 18

Jak zrealizować dwukierunkowe wiązanie danych MVVM w Vanilla JS?

Czytaj więcej
Grafika przedstawia Biblioteka MathJax  obsuga rwna matematycznych w internecie
2 lutego 2025 2 min 17

Biblioteka MathJax - obsługa równań matematycznych w internecie

Czytaj więcej

Poprzedni wpis

Moja pasja fotografii
Wymiana doświadczeń

Masz podobne doświadczenia?

Chętnie poznam Twoją perspektywę i porozmawiam o tym temacie szerzej.

Napisz do mnie

Każda perspektywa może wnieść coś wartościowego do dyskusji.

Twoja prywatność i pliki cookies

  1. Ta strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania – m.in. do poprawnego wyświetlania treści, zapamiętania podstawowych ustawień przeglądarki oraz zapewnienia stabilności serwisu.
  2. Nie stosuję plików cookies w celach marketingowych, reklamowych ani analitycznych.
  3. Strona ma charakter wyłącznie informacyjny i nie zawiera formularzy kontaktowych, rejestracyjnych ani zakupowych, przez które dane mogłyby być przesyłane na serwer.
  4. Nie zbieram danych osobowych podczas zwykłego korzystania z witryny.
  5. Serwis nie korzysta z certyfikatu SSL, jednak ze względu na informacyjny charakter strony nie jest wymagane przesyłanie poufnych danych. Zalecam jednak, aby nigdy nie wpisywać haseł ani danych osobowych na stronach bez szyfrowanego połączenia.
  6. Korzystając z tej strony, wyrażasz zgodę na używanie wyłącznie niezbędnych plików cookies.

Więcej informacji znajdziesz w mojej polityce prywatności.