2012-10-16 66 views
4

我想建立一个基于JavaScript(jQuery将用于AJAX)和PHP的聊天。用jQuery和PHP实现长轮询

我听说过这样做的好方法是使用长轮询。

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

无限循环听起来像一个坏主意。

+1

使用PHP并不是一个好主意。你有没有考虑过使用类似nodejs的东西? – ThiefMaster

+1

同意像node.js这样的非阻塞可能会更理想,但如果这不是一个选项,你可以*在PHP中实现,如我在下面的答案。 – doublesharp

+0

您是否尝试过WebSockets? – Xeoncross

回答

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); 
+0

为什么不是处理器的使用100% ** 1)循环内部的睡眠** - 处理器只运行一次循环,然后搁置一段时间,然后回到它处理器=没有100%的处理器使用率 ** 2)LOOP情况A结束:**((时间() - $现在)<$超时) =((CURRENT_TIME - TIME_WHEN_THE_SCRIPT_STARTED) TIMEOUT_SET_BY_YOU的循环将结束 ** 3)LOOP结束情况B:** if(!empty($ data))break; =如果循环成功获取数据,它会中断=>结束 –

0

实施这类聊天是不是在PHP好主意,你可以使用CometChatNodjs,如果你不能在服务器上安装脚本比你可以利用现有的API进行实时发送数据,

PubnubPushemr,Beaconpush

+0

为什么使用PHP不是一个好主意,你能给出更多关于你推理的细节吗? – Gilberg

+0

因为PHP不是为此而做的...... PHP无法处理大量的同时连接..并且会在PHP服务器上花费太多..所以正确的技术对于正确的需求..“剑不能取代针” –