我寫了簡單的PHP長輪詢技術,阿賈克斯EN MySQL的:
的PHP代碼如下:
timeout = 600;
while (timeout > 0) {
$res = db_query("QUERY");
$return_value = create_value_from_result($res);
// see if the result changed
$db_hash = md5($return_value);
if ($_SESSION['hash'] == $db_hash) {
// the result didn't change -- sleep and poll again
// usleep take microseconds, 100000 is 100 millisecond
// this is the default database polling interval
usleep(100000);
$timeout--;
} else {
// the result changed -- reply the result and set the session hash
$timeout = 0;
$_SESSION['hash'] = $db_hash;
}
}
return json_encode($return_value);
和JavaScript是簡單的Ajax(Dojo是這種情況):
function longpoll() {
dojo.xhrPost({
url: 'longpolling.php',
load: function (data, ioArgs) {
data = dojo.fromJson(data);
do_magic(data);
// use settimeout to avoid stack overflows
// we could also use a while(1) loop,
// but it might give browser errors such as 'script is
// running too long' (not confirmed)
setTimeout(longpoll, 0);
}
});
}
您需要60秒超時以確保瀏覽器在Ajax調用中不超時。
這樣,只要QUERY的結果發生變化(插入記錄,更新記錄中的更新),PHP調用就會返回並且Ajax會得到結果。
您可以使用長輪詢。它基本上是一個簡單的輪詢器,直到有數據纔會返回。讓長輪詢器(通常是PHP)中的代碼輪詢數據庫以查找事件。這種情況下,您可以在數據庫上進行毫秒精確輪詢,而無需使用現成的技術創建大量數據流量。 –
目前我正在使用類似的方法,但仍有差不多1.5秒。我想減少。 –
找出1.5秒來自哪裏。我們創建了長達1分鐘的超時輪詢器,並在100毫秒內響應100毫秒輪詢。 (另外:你真的需要亞秒精度嗎?也許你使用的是錯誤的工具,然後......) –