PHP je věda

Objektově orientované programování nejen v PHP

Real time komunikace a PHP – Long polling

Long polling využívá na straně klienta ajax request, který je v controlleru tak dlouho pozdržen, dokud nemá nějakou informaci, kterou by chtěl view sdělit. V následujícím příkladu je pro jednoduchost controller jednoduchý php soubor. Jak vidíme, kód se snaží vyhledávat v ChatRepository nové zprávy pro uživatele. Pokud ji najde, vrátí ji jako json string, pokud ne, program uložíme na jednu sekundu program ke spánku. Pokud se žádná zpráva nenašla ani za 60 sekund, vrátíme zpět error response. Javascriptový client v prohlížeči by po obdržení této zprávy měl opět odeslat request, zda existují nové zprávy.

<?php
 
class ChatRepository {
 
    public function findMessageForUser($idUser) {
 
    }
}
 
$repository = new ChatRepository();
$timeStart = time();
$message = $repository->findMessageForUser($_REQUEST['id']);
while (!$message && time() - $timeStart < 60) {
    $message = $repository->findMessageForUser($_REQUEST['id']);
    if ($message) {
        return json_encode($message->toArray());
    }
    sleep(1);
}
return json_encode(array("ERR" => "no messages found"));

Zpráva v tomto případě může znamenat cokoliv, ne jen textovou zprávu. Může to být například název javascriptové metody, která se má vykonat. Záleží na tom, jak si s tím javascript na straně prohlížeče dokáže poradit. Jelikož toto je spíše technická lahůdka, pro kterou neexistují standardní řešení, mohu na tomto místě pouze konstatovat, že zde záleží pouze na fantazii programátora.

Dalším zádrhelem je sleep. Z hlediska programování žádný problém, ale pokud budete mít takto připojených více než 20 uživatelů, budete potřebovat opravdu dobrého serveradmina. Teoreticky záleží počet spojení pouze na operační paměti Vašeho serveru. Jedno spojení potřebuje zhruba 10MB, pokud máte tedy server se 4GB paměti, mělo by být teoreticky možné udržet až 400 spojení. Za tuto informaci však v žádném případě neručím! V každém případě se na tom ale nejprve domluvte s Vaším adminem.