为了账号安全,请及时绑定邮箱和手机立即绑定

使用彗星与PHP?

使用彗星与PHP?

PHP
HUH函数 2019-06-19 15:58:54
我正在考虑使用PHP后端实现实时聊天,但我在一个讨论Comet的网站上看到了这样的评论:我的理解是,PHP对于Comet来说是一种糟糕的语言,因为Comet要求您保持对每个浏览器客户端的持久连接打开。使用mod_php意味着为每个客户端绑定一个Apache子程序,这一点都不伸缩。我认识的从事Comet工作的人大多使用TwistedPython,它被设计用来处理数百或数千个同时连接。这是真的吗?或者是可以配置的东西?使用彗星与PHP?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

同意/扩展已经说过的话,我不认为FastCGI会解决这个问题。

阿帕奇

Apache中的每个请求都将使用一个工作线程,直到请求完成,这对于Comet请求来说可能需要很长时间。

这篇关于Ajaxian的文章提到在Apache上使用Comet,这是很困难的。这个问题并不是PHP特有的,它适用于您可能希望在Apache上使用的任何后端CGI模块。

建议的解决方案是使用事件MPM模块这将改变向工作线程发送请求的方式。

此MPM试图修复HTTP中的“保持活动”问题。客户端完成第一个请求后,客户端可以保持连接打开,并使用相同的套接字发送进一步的请求。这可以节省创建TCP连接的重要开销。但是,Apache传统上会让整个子进程/线程等待来自客户端的数据,这带来了自身的缺点。为了解决这个问题,此MPM使用一个专用线程来处理侦听套接字和处于“保持活动”状态的所有套接字。

不幸的是,这也不起作用,因为它只会“打瞌睡”请求已完成,等待来自客户端的新请求。

PHP

现在,考虑到问题的另一面,即使您解决了每个Comet请求搁置一个线程的问题,每个请求仍然需要一个PHP线程-这就是FastCGI帮不上忙的原因。

你需要这样的东西延续它允许在观察到由彗星触发的事件时恢复彗星请求。AFAIK,这在PHP中是不可能的。我只在Java中见过-见ApacheTomcat服务器.

编辑:

有一个此文关于使用负载平衡器(羟基)允许您在同一服务器的端口80上同时运行Apache服务器和启用Comet的服务器(例如jetty,tomcatforJava)。


查看完整回答
反对 回复 2019-06-19
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

PHP

我发现这个有趣的小东西屏风解释简单的彗星。顺便提一句,我真的认为这会在任何实际负载下杀死您的服务器。当有几个用户的时候,我会说只需要这个解决方案。这个解决方案实现起来非常简单(屏幕只需要5分钟的时间:)。但是,正如我之前告诉过的,我不认为它对许多并发用户是有益的(估计您应该对其进行基准测试;),因为:

  1. 它使用文件I/O,比从内存获取数据要慢得多。例如,函数

    filemtime(),

  2. 第二,但我不认为最起码的PHP没有一个合适的线程模型。PHP不是为此而设计的,因为

    不共享模型

    ..就像幻灯片上说的,“共享数据被向下推到数据存储层”,比如MySQL。

备选方案

我真的认为,如果您想做任何彗星/长轮询,您应该尝试其他方法。您可以使用多种语言,例如:

  • Java/JVM:Jetty

    延续.

  • Python:达斯汀的

    晃动.

  • Erlang:彗星/等的流行语言。
  • Lua,Ruby,C,Perl,仅举几个例子。

只需执行一个简单的Google搜索,就会向您展示许多替代方案-PHP(我认为在任何大负载下,PHP都会杀死您的服务器)。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 325 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信