【发布时间】:2013-10-14 04:41:07
【问题描述】:
将 Facebook 等通知发送到仪表板的理想机制是什么?我认为最好的方法是每 5 秒对 php 页面进行一次 Ajax 调用并检索通知。
有没有更好的方法来做类似的改变?
它也应该适用于所有移动浏览器。
我是这样做的,
在 jquery 中使用$.post 获取数据而不刷新页面。
$.post("page.php",{"act":1},function(data){
$("#id").html(data);
});
in page.php write your query
编辑 1
我参考了一些在线笔记并实时工作后写了一个这样的函数。
var TimeStamp = null;
function waitForMsg() {
$.ajax({
type: "GET",
url: "getData.php?timestamp=" + TimeStamp,
async: true,
cache: false,
timeout: 50000, /* Timeout in ms */
// data: "TimeStamp=" + TimeStamp,
success: function( data ) {
var json = eval('(' + data + ')');
if ( json['msg'] != "" ) {
alert( json['msg'] );
}
TimeStamp = json['timestamp'];
setTimeout(
'waitForMsg()', /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function( XMLHttpRequest, textStatus, errorThrown ) {
alert("error:" + textStatus + "(" + errorThrown + ")");
setTimeout(
'waitForMsg()', /* Try again after.. */
"15000"); /* milliseconds (15seconds) */
},
});
}
;
// calling after dom is ready
$(document).ready(function() {
waitForMsg();
});
PHP 文件是,
<?php
$filename = dirname(__FILE__).'/data.txt';
$lastmodif = isset( $_GET['timestamp'] ) ? $_GET['timestamp'] : 0;
$currentmodif = filemtime( $filename );
while ( $currentmodif <= $lastmodif ) {
usleep( 10000 );
clearstatcache();
$currentmodif = filemtime($filename);
}
$response = array();
$response['msg'] = file_get_contents( $filename );
$response['timestamp'] = $currentmodif;
echo json_encode($response);
编辑 2
一切正常,但是当 data.txt 文件没有发生变化时,我会在 50 秒内收到这样的错误消息。
错误:超时(超时)
如何预防?
【问题讨论】:
-
我认为定期发布 ajax 帖子是最好的方法。但是它提出了一个问题,如果有一天你得到,比方说,10 亿用户,其中 3 亿在任何给定时间点登录,这意味着每 5 秒对 PHP 页面进行 3 亿次调用!我很想知道还有哪些其他方法。
-
@DS。是的,这是真的,但我正在寻找其他选择。
-
@mazraara 如果你想做正确的事情,请查看 websocket 服务器,socket.io 是一个流行的。
-
@mazraara - 看看这个,它可能会有所帮助 - stackoverflow.com/questions/16860106/…
-
@DS。请检查上面编辑过的问题。