我想实现一个聊天应用程序,但我不想使用超时,因为它每隔几秒检查一次。有没有其他方法可以做到这一点?
答案 0 :(得分:2)
你可以使用ajax调用一个php页面,该页面会挂起,直到有新的东西然后将它发送给客户端,并且在ajax使用它得到的内容后,它可以向该页面发出另一个请求,又挂了。这样您就可以将请求交换到服务器以进行服务器处理。您可以使用usleep和while循环来保持页面处于活动状态,并且不要忘记设置页面的执行时间限制。
编辑1:
好吧,我假设您有一个函数来发送数据(我将其称为request
),并异步等待响应,并且您将函数链接到响应时执行。我们称之为函数listen
。
另一个函数send
发送用户或其他任何内容的回复。 send
和listen
都会请求相同的网页,其中一个网页没有POST
或GET
数据(listen
),另一个网页请求POST
数据包含回复或其他内容。
初始请求将使用listen
完成,或者当您想要手动启动侦听器时以及响应之后。另一个是在你发送东西时调用的。
重要的是php代码。
如果你在linux环境中工作,你可以使用很多东西,比如os信号,但一般来说我们可以使用while和usleep,这样我们就不会杀死服务器。
现在:
<?php
// code for mysql
if(isset($_POST))
{
mysql_query("INSERT INTO table (user,instance,date,reply) VALUES('".$_SESSION['user']."','room','etc','".mysql_real_escape_string($_POST['reply'])."')");
$_SESSION['last_reply_id'] = mysql_insert_id();
}
while(true)
{
$rez = mysql_query("SELECT * FROM `table` WHERE `id` > '".$_SESSION['last_reply_id']."' ORDER BY `id` DESC");
$repls = array();
if(count($rez))
{
while($rez = mysql_fetch_array($rez))
{
$repls[] = $rez;
}
$_SESSION['last_reply_id'] = $repls[0]['id'];
echo json_encode($repls);
break;
}
else
{
usleep(200000);
}
}
?>
现在,你首先调用listen
,它将等到它回显制动循环,当它发生时,你使用结果,然后再次调用listen
。如果你想发送一些东西,你使用send
,它必须制动前一个请求并创建一个新的,在写入数据之后将启动监听器。等等,我希望你有这个想法,告诉我你是否想澄清它。
不要忘记在页面开头使用set_time_limit(0);
。
我可能有点偏离,需要查看此代码,但这是主要想法。
答案 1 :(得分:0)
嗯,任何方法都需要每隔几秒检查一次数据库,或者需要多长时间来检查数据库。
Javascript中唯一的另一种方法是setInterval(代码,时间),每隔“时间”执行一次代码。
只是为了澄清,如果您希望聊天能够在不重新加载页面的情况下自动更新。
答案 2 :(得分:0)
类似的问题以前已经好几次了。我几天前发布了this answer,建议使用Websocket或Node.js.也许这可以让你开始。