使用php/mysql即时通知,请给我一个大致的想法


Instant notification using php/mysql,please give me a general idea

有人能告诉我们如何从数据库中检索数据吗?就像Facebook的通知一样。我的要求我有一个用户表和一个消息表。当用户需要发送消息时,会在消息表中输入发送方和接收方用户id。因此,我需要实时向接收方显示新的传入消息状态。

它很像ajax,只是目标不同:更多的开放套接字挂起,请求更少,而更多的请求,打开的套接字更少。JS向服务器(实际上是其中的两个)发出请求,服务器不会立即响应,而是挂起并休眠,直到有数据要发送到客户端,在这种情况下,它会立即返回内容。有两个打开的挂起请求的原因是,一旦其中一个超时,第二个请求仍然可以接收通知,而第一个请求则重新连接。这样,总是至少有一个挂起的请求。可以查看APE、COMET、"反向ajax"或"使用javascript进行长轮询"。使用长轮询而不是传统轮询有好处也有缺点,我建议您研究哪一种更适合您的情况。

干杯

我所知道的是,Facebook在javascript中对mousemove事件和超时进行了处理。如果不移动光标,则不会触发获取通知的事件。当您移动光标并且没有指定超时时,将触发获取通知的事件,并发送新的超时。如果此新超时到期,则触发事件,如果光标尚未移动,则不会设置新超时。

要获取通知,请使用ajax获取消息表的未读消息。

这项技术被称为Comet。这个想法是JavaScript对服务器进行AJAX调用。服务器接受连接,在为客户端找到内容之前不返回任何内容。想象一下,如果我想获得即时通知,我的浏览器对服务器进行AJAX调用,服务器正在数据库中寻找新的通知。如果有,它会立即返回它们,如果没有,它只会休眠0.5秒,然后再次查询数据库,直到它在那里找到新的东西。

这里是制作彗星的示例代码:

<?
if(!isset($_POST['notificationLastId'])){
    exit;
}
// Query database every 0.5 seconds
$interval = 0.5;
// Hold maximum 30 seconds
$timeout = 30;
// You need to close session if it open otherwise all other queries within 
// same session will hang, because of session locking
session_write_close();
$startTime = time();
$response = array();
while (true){
    // Query database to see if there are any new 
    // notifications  with id greater then $_POST['notificationLastId']
    if(count($newNotifications) or time()-$startTime > $timeout){
        $response['newNotifications'] = $newNotifications;
        // get last id of notifications table
        $response['lastId'] = $notificationLastId
        header('Content-type: application/json');
        echo json_encode($response);
    }
    // Sleep not to cosume too much server resources
    usleep($interval*1000000);
}
exit;
?>

您可以对表的特定部分使用AJAX来定期检查新的更新。但这将消耗服务器的最大资源,因此该解决方案是使用不同的服务器,并使用AJAX进行cron作业以进行定期更新。

如果你说,就像聊天一样,最好按照你的要求使用APE。