Autor Zpráva
G3n3sis19
Profil
Dobrý odpoledne,

mám tu problém. Přes ajax volám stránku, která každou vteřinu vybere z databáze novinky (např u mě zprávy v chatu), a pokud nějaké jsou, vypíše je a "umře", jinak sleep();ne a pokračuje za 1 vteřinu, dokud není novinka nebo dokud nedosáhne timeout (50 000 ms)

Problém je, že když se "načítá" (čeká) skript který kontroluje novinky a mezitím pošlu správu (ajaxem, POST), tak ten pozdější čeká, než se udělá ten, co kontroluje novinky:


1. ajax.php?co=novinky (max 50s, nebo po nové události)
2. ajax.php?co=pridat_zpravu (měl by se udělat ihned)

jenže 2. čeká na dokončení jedničky. Hledal jsem hledal a zjistil jsem, že sleep(); sleepuje všechny skripty pro stejnou SESSION, a tudíž je možné, že se zpráva odešle do DB až po těch 50sekundách.
Jak to mám tedy udělat, aby se nepletly a POST se udělal zároveň s GETEM který každou vteřinu spí a vytahuje novinky ?

Ve firebugu to vypadá následovně


kód jedničky vypadá asi takto
$sek = 0;
while ($sek<49)
{
    $novinky = mysql_num_rows(mysql_query("SELECT id FROM novinky ....."));
    if ($novinky)
    {
        $novinky_data = json_encode(mysql_fetch_assoc(mysql_query("SELECT * FROM novinky ....")));
        die($novinky_data);
    }
    else
    {
         sleep(1);
    }
}
die("zADNY novinky");
Jan Tvrdík
Profil
Zkus před zde uvedený první řádek umístit volání session_write_close();.
G3n3sis19
Profil
díky moc za radu. vyřešil jsem to malinko jinak. long-polling script mám teď na subdoméně a funguje to!
Mám tu jen malý přesto nepřípustný problém:

když dám před while(){} kód
print_r($_SESSION);print_r($_COOKIE);die();
(ten na jiné subdoméně (stejný server)), tak výsledek (tělo) přes firebug je
array
(
)
array
(
)

ale když si OKOPÍRUJU stejnou adresu toho skriptu a dám ho do browseru, vidím

array
(
      [username] => martin_test
     
)
array
(
     [PHPSESSID] => as2d316a54d65s4g
)


když se podívám v browseru na cookie, PHPSESSID má doménu s tečkou na začátku, tutíž to má vidět všude. bohužel, když si tam šáhnu ajaxem, SESSION nevidí :(

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0