【发布时间】:2013-02-23 03:55:24
【问题描述】:
我正在尝试制作一个聊天脚本,但我不希望访问者的浏览器每 0.5 秒请求一条新消息。相反,我希望服务器立即发送新消息。
我想我可以向服务器发送一个请求,如果没有任何新消息,服务器会等到有新消息。这个等待时间不需要很长,大概2-3秒。
我试过PHP的sleep()函数:
while(1)
{
$temp=$db->query("SELECT * FROM chat WHERE (id=36 OR id=12) AND clock>".$last_time);
if ($temp->rowCount()!=0) break;
sleep(1);
}
当其他访问者中断循环时,此“等待中断”过程有效,但当启动循环的访问者尝试发送消息时,他会一直等待。
我是不是走错了路?
编辑 *系统为 IIS 7 - PHP 版本 5.3.6
【问题讨论】:
-
apache 一次只允许来自同一台机器的 1 个连接,尝试增加限制,或者使用 nginx 或 lighttpd 或其他一些合适的长轮询服务器。
-
这种机制是否可取是另一回事,但是:你可能需要用
session_write_close();关闭会话,否则它会阻塞所有其他请求。开箱即用的 Apache 与之前的 cmets 不同,通常支持来自同一 ip 的多个连接,除非另有明确配置。 -
非常感谢@Wrikken 我把 session_write_close() 放在循环之前,它工作正常......