使用jQuery和PHP实现长轮询

4

我想基于JavaScript(使用jQuery进行AJAX)和PHP构建一个聊天应用。

我听说使用长轮询是实现这一目标的好方法。

我理解这个想法,但不知道如何在服务器端实现它。

无限循环听起来像一个糟糕的主意。


1
使用PHP并不是一个好主意。你考虑过使用像nodejs这样的东西吗? - ThiefMaster
1
同意像Node.js这样的非阻塞技术可能更理想,但如果这不是一个选项,你仍然可以像我下面的回答一样在PHP中实现。 - doublesharp
你尝试过使用WebSockets吗? - Xeoncross
2个回答

7

您不希望创建无限循环,但您可以设置超时。基本上,循环等待某种数据的X秒钟,如果没有发生,则向客户端发送响应,告诉它需要启动新请求,该请求具有相同的超时期。

$source; // some data source - db, etc
$data = null; // our return data
$timeout = 30; // timeout in seconds
$now = time(); // start time

// loop for $timeout seconds from $now until we get $data
while((time() - $now) < $timeout) {
    // fetch $data
    $data = $source->getData();

    // if we got $data, break the loop
    if (!empty($data)) break;

    // wait 1 sec to check for new $data
    usleep(10000);
}

// if there is no $data, tell the client to re-request (arbitrary status message)
if (empty($data)) $data = array('status'=>'no-data');

// send $data response to client
echo json_encode($data);

为什么处理器使用率不是100%?1)在循环中加入SLEEP - 处理器只运行一次循环,然后将脚本放置一段时间,然后再回到它=没有100%的处理器使用率。2)循环结束情况A:((time() - $now) < $timeout) = ((当前时间 - 脚本启动时的时间) < 您设置的超时时间)当前时间 - 脚本启动时的时间 = 当前超时时间,因此当当前超时时间>您设置的超时时间时,循环将结束。3)循环结束情况B:如果(!empty($data))break; = 如果循环成功获取数据,则会中断=>结束。 - jave.web

0

在 PHP 中实现这种类型的聊天并不是一个好主意,你可以使用 CometChatNodjs,如果你无法在服务器上安装脚本,那么你可以使用可用的实时数据发送 API,

例如 PubnubPushemrBeaconpush


为什么使用PHP不是一个好主意,您能详细说明一下您的理由吗? - Gilberg
因为PHP不是为此而设计的... PHP无法处理大量同时连接.. 并且会对php服务器造成很大的负担.. 因此,正确的技术需求匹配是非常重要的.. "一把剑不能代替一根针" - Bhavesh G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接