Lassú server push

Lassú server push
2013-02-02T15:01:04+01:00
2013-02-02T15:40:45+01:00
2022-11-28T04:00:45+01:00
zagika
Sziasztok!

Ha új adat kerül az adatbázisba ki akarom íratni. Mutatom a kódot:

<?php include 'libfunction.php'; $dbhost="localhost"; $dbuser="root"; $dbpass=""; $dbname="ajaxproba"; $dbtable="szoveg"; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); $filename = dirname(__FILE__).'/data.txt'; $word = isset($_GET['word']) ? $_GET['word'] : ''; if ($word != '') { $feladat = "INSERT INTO `szoveg` (`szoveg`,`x`,`y`,`negyzet_id`) VALUES ('$word','1','1','1')"; $result = mysql_query($feladat) or die(mysql_error()); file_put_contents($filename,$word); die(); } $sql = "SELECT id FROM szoveg ORDER BY id DESC LIMIT 1"; $result = mysql_query($sql) or die(mysql_error()); while ($record=mysql_fetch_array($result)){ $lastId=$record['id']; } $lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; $sql = "SELECT UNIX_TIMESTAMP(created) AS DATE FROM szoveg WHERE id=$lastId"; $result = mysql_query($sql) or die(mysql_error()); while ($record=mysql_fetch_array($result)){ $date=$record['DATE']; $currentmodif = $date; } $sql = "SELECT szoveg FROM szoveg WHERE UNIX_TIMESTAMP(created) BETWEEN '".$lastmodif."' AND '".$currentmodif."'"; $result = mysql_query($sql) or die(mysql_error()); while ($record=mysql_fetch_array($result)){ $szoveg=$record['szoveg']; } $currentmodif = filemtime($filename); while ($currentmodif <= $lastmodif) { usleep(1000); clearstatcache(); $currentmodif = filemtime($filename); } $response = array(); $response['schematabinfo'] = $dbname.".".$dbtable; $response['word']=$szoveg; $response['timestamp'] =$currentmodif; echo json_encode($response); flush(); closeConnection($conn); ?>
A kérdésem az lenne, hogy mitől van az, hogy van amikor rögtön kiírja az utoljára bevitt adatot, máskor meg 10-20 másodperc is mire megjelenik?
Köszönöm.
Mutasd a teljes hozzászólást!
Ha valahol a
libfunction.php
-ban van egy session_start(), akkor az okozhatja a lassulást, mivel a php alapértelmezett session kezelője fájlba dolgozik, és a session_start() ezt lockolja is addig, amíg véget nem ért a futás.

Az oka egyszerűen az, hogy ha két kérés érkezik egyszerre és mindkettő írná ugyanazt a session-t, akkor ha nem lenne lock a fájlon, akkor egymást felülírnák és kavar lenne, így viszont az első tud írni a fájlba csak, a második pedig vár mindaddig amíg az első fel nem szabadítja, ami cometnél lehet 10-20-60 mp is, amíg a lekérő ajax timeoutra nem fut.

Megoldás lehet a session_write_close() - ez lezárja a session-t és felszabadítja a fájlt, de ezután már csak olvasni tudod a $_SESSION tömböt, írni nem az adott futáson belül.
Mutasd a teljes hozzászólást!

  • Használsz beépített session-t (session_start())?
    Mutasd a teljes hozzászólást!
  • Amikor kezdtem írni a kódot, beletettem a session_start()-ot, mert akkor még úgy gondoltam, hogy kelleni fog. De ugye nem használtam és kitöröltem, azóta mintha egy kicsit gyorsabban mutatná a bevitt adatot.
    Mutasd a teljes hozzászólást!
  • Ha valahol a
    libfunction.php
    -ban van egy session_start(), akkor az okozhatja a lassulást, mivel a php alapértelmezett session kezelője fájlba dolgozik, és a session_start() ezt lockolja is addig, amíg véget nem ért a futás.

    Az oka egyszerűen az, hogy ha két kérés érkezik egyszerre és mindkettő írná ugyanazt a session-t, akkor ha nem lenne lock a fájlon, akkor egymást felülírnák és kavar lenne, így viszont az első tud írni a fájlba csak, a második pedig vár mindaddig amíg az első fel nem szabadítja, ami cometnél lehet 10-20-60 mp is, amíg a lekérő ajax timeoutra nem fut.

    Megoldás lehet a session_write_close() - ez lezárja a session-t és felszabadítja a fájlt, de ezután már csak olvasni tudod a $_SESSION tömböt, írni nem az adott futáson belül.
    Mutasd a teljes hozzászólást!
  • Köszönöm a hasznos leírásod.
    Nincs a libfunction.php-ban se session_start(). Észrevehető, hogy amióta nincs benne fájlba a session_start() tényleg gyorsabb. Ha elindítom a fájlt azonnal kiírja a legutolsó bevitt adatot, ha pedig a kódba a formon viszem be az új szót, akkor mindig 5-6 másodperc múlva kiírja. Ez is haladás már legalább, mert ezelőtt volt amikor fél perc múlva se akarta kiírni.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd