Autor Zpráva
Vilak
Profil
Zdarec. Chci vytvořit online chat. Snad tu nejjednodušší formu, co šla, jsem si sepsal (jen pro příklad). Ovšem nevím, jak udělat, aby když někdo přidá nějaký "komentář", tak jak udělat to, aby to člověk u druhého pc okamžitě viděl.
Vím, že to jde pomocí ajaxu a toho, že se to bude (třeba) obnovovat každé 2 sekundy, ale já to chci (pokud to jde) udělat tak, že se chat bude "obnovovat" jen tehdy, když do DB přibude nová zpráva, tedy ne pořád, ale jen když tam někdo něco vloží (prakticky jak je třeba na FB).

Tento code je neošetření a úplně primitivní. Jde mi pouze o funkčnost.
<body>
    <h2>Online chat</h2>
    <div>
        <form action="index.php" method="POST">
            <table>
                <tr>
                    <td>
                        <input name="text" type="text">
                        <input name="go" value="ODESLAT" type="submit">
                    </td>
                </tr>    
            </table>
        </form>
    </div>
    <?php

        // připojení se k db
        include "db.php";

        // pokud se formulář odešle, zapíše se do db
        if (isset($_POST['go'])) {
            $text = $_POST['text'];

            mysql_query("INSERT INTO `seznam` (`text`) VALUES ('".$text."')");
        }

        // získání dat z databáze a vypsání
        $dotaz = mysql_query("SELECT * FROM `seznam` ORDER BY `id` DESC");
        echo "<div><table border=\"1\">";
        while ($vypis = mysql_fetch_assoc($dotaz)) {
            echo "
                <tr>
                    <td>".$vypis['text']."</td>
                </tr>
            ";
        }
        echo "</table></div>";
    ?>
</body>
Keeehi
Profil
Problém je, že http protokol není primárně navržený k tomu, aby server kontaktoval klienta.

Dá se využít long pooling. Což asice není přímo že by server kontaktoval klienta ale blíží se tomu.
Pro novější prohlížeče je možné použít web socket. Což navíc musí podporovat i server. Takže na hostinu to nemusíš vůbec rozchodit.
mimochodec
Profil
Dané je toto: z jedné strany v databázi nové texty přibývají, druhá strana o nově přibyvších neví a nějakým způsobem musí zjistit, jestli něco nepřibylo, a to maximálně úsporně. Na straně klienta nemáš úspornější možnost, než se ajaxem ptát, jestli není něco nového. Optimalizovat můžeš tu serverovou stranu, kde si umím představit různé triky, jako třeba extra tabulku o jednom řádku a jednom sloupci, kde bude číslo, které při každém insertu do tabulky textů inkrementuješ. Na hodnotě nezáleží. Když ten ajax zjistí, že číslo je větší, než to co bylo minule, řekne si o data z tabulky textů.
Nebo to nebudeš inkrementovat, ale budeš tam dávat hodnotu posledního ID z tabulky textů. A když ajax zjistí, že tam je nová hodnota, máš rovnou čísla pro BETWEEN.
Od určité zátěže chatu (resp. počtu těch testovacích dotazů, po kterých bude následovat dotaz na data) to ale bude z pohledu efektivity spíš prodělek.
Vilak
Profil
takže to nějak jednoduše udělat nejde? nejlepší tedy bude to obnovovat (třeba) každé 2 sekundy ajaxem, jo?
a pak si akorát pohrát s mysql a výpisem dat...?
Str4wberry
Profil
Myslím, že pro desítky lidí nebude problém používat ten AJAX s klidně sekundovou kontrolou (tj. zobrazení nové zprávy v průměru po cca 0,5 s).

Třeba hosting za pár korun u Wedosu nabízí 5 paralelních PHP procesů. V čistém PHP by neměl být problém nové zprávy připravit za nějakých 10–20 milisekund, tedy se teoreticky stihne odbavit až 250–500 odpovědí za vteřinu, jestli dobře počítám.

Pokud by vteřinová kontrola nestačila, šlo by do 100 současně připojených lidí použít zdarma Firebase, kde se nová zpráva zobrazí prakticky okamžitě. Na té stránce je i dostupný tutoriál, kde se právě chat vytváří.
yFang
Profil
Vilak:
Pokud netrváš na PHP, zkus se podívat na socket.io.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0