Autor | Zpráva | ||
---|---|---|---|
Vilak Profil |
#1 · Zasláno: 4. 9. 2015, 08:33:52
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 |
#2 · Zasláno: 4. 9. 2015, 09:14:28
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 |
#3 · Zasláno: 4. 9. 2015, 09:25:25
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 |
#5 · Zasláno: 4. 9. 2015, 11:19:33
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 |
#6 · Zasláno: 5. 9. 2015, 14:19:03
Vilak:
Pokud netrváš na PHP, zkus se podívat na socket.io. |
||
Časová prodleva: 9 let
|
0