【问题标题】:Can we delay response of a PHP page until another flag request of same visitor?我们可以延迟 PHP 页面的响应,直到同一访问者的另一个标志请求?
【发布时间】: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() 放在循环之前,它工作正常......

标签: php sleep


【解决方案1】:

我不太清楚你为什么在这里标记facebook-chat

无论如何,这种方法是不合适的,并且会使您的服务器因数据库查询而过载。您应该使用long-pollingwebsockets。让用户轮询更新可能听起来很多,但只要做得好就可以了。

【讨论】:

  • 我标记了 facebook-chat 因为 facebook 使用类似的东西。如果没有新内容,它会让请求等待 40 秒。
  • 据我所知,在 fb 聊天中,您不能使用长轮询。它只适用于真正的套接字连接 - 例如与 pidgin 等客户端。不过它应该适用于网络套接字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 2013-09-20
  • 2014-06-24
  • 1970-01-01
  • 2021-06-06
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多