代码之家  ›  专栏  ›  技术社区  ›  ryeguy

在PHP中使用comet?

  •  84
  • ryeguy  · 技术社区  · 16 年前

    我在考虑使用PHP后端实现实时聊天,但我在一个讨论comet的网站上看到了这条评论:

    我的理解是PHP是一个 Comet的语言很糟糕,因为 持久连接对每个人开放 浏览器客户端。使用mod_php这个 根本无法缩放。人民I 知道做彗星的事情大多是 使用Twisted Python

    这是真的吗?或者它是可以配置的东西吗?

    11 回复  |  直到 16 年前
        1
  •  62
  •   Kothar    15 年前

    This article on Ajaxian

    'event' MPM module

    此MPM试图修复 HTTP中的“保持活动问题”。 客户端完成第一个 连接打开,并继续发送 使用同一套接字的请求。这 可以节省大量开销 缺点。为了解决这个问题, Keep Alive中的所有插座

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

    现在,考虑到问题的另一面,即使你解决了每个彗星请求占用一个线程的问题,每个请求仍然需要一个PHP线程——这就是为什么FastCGI没有帮助。

    你需要这样的东西 Continuations Tomcat server .

    编辑:

    有一个 article here 关于使用负载平衡器( HAProxy

        2
  •  14
  •   Jamie    10 年前

    您可以使用Nginx和JavaScript来实现一个基于Comet的聊天系统,该系统具有很高的可扩展性,内存或CPU利用率很低。

    我这里有一个非常简单的例子,可以让你开始。它涵盖了使用NHPM模块编译Nginx,并包括jQuery、PHP和Bash中简单的发布者/订阅者角色的代码。

    http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/

        3
  •  10
  •   Community CDub    8 年前

    PHP程序

    我发现这很有趣 screencasts 解释简单的彗星。顺便说一句,我真的认为这会在任何实际负载下杀死你的服务器。当只有几个用户时,我会说选择这个解决方案。这个解决方案很容易实现(屏幕录制只需要5分钟的时间:)。但正如我之前所说的,我认为这对很多并发用户来说并不好(我想你应该对它进行基准测试;),因为:

    1. 它使用文件I/O,这比从内存中获取数据要慢得多。例如,功能 filemtime() ,
    2. share nothing model

    替代方案

    只需执行一个简单的谷歌搜索,就会向你展示很多替代品,还有PHP(我认为任何大负载都会杀死你的服务器)。

        4
  •  7
  •   vartec    16 年前

    mod_php不是使用php的唯一方法。你可以使用fastcgi。PHP必须使用 --enable-fastcgi .

    PHP作为FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10

        5
  •  6
  •   Community CDub    5 年前

    你也可以试试 https://github.com/reactphp/react

    事件循环基于反应器模式(因此得名),并受到EventMachine(Ruby)、Twisted(Python)和Node.js(V8)等库的强烈启发。

    <?php
    
    $i = 0;
    
    $app = function ($request, $response) use (&$i) {
        $i++;
    
        $text = "This is request number $i.\n";
        $headers = array('Content-Type' => 'text/plain');
    
        $response->writeHead(200, $headers);
        $response->end($text);
    };
    
    $loop = React\EventLoop\Factory::create();
    $socket = new React\Socket\Server($loop);
    $http = new React\Http\Server($socket);
    
    $http->on('request', $app);
    
    $socket->listen(1337);
    $loop->run();
    
        6
  •  4
  •   Evan P.    16 年前

    http://morglog.org/?p=22=1 它实现了此方法的一部分(尽管也有一些调试代码)。

        7
  •  3
  •   Tim    15 年前

    项目页面: http://github.com/Tim-Smart/phet

    免费参与开发。我目前已经设法完成了大部分服务器逻辑,只需要完成客户端的工作。

    EDIT:最近使用 pcntl_fork

        8
  •  3
  •   Jerod Venema    15 年前

    在PHP中实现comet会很困难,因为它固有的单线程特性。

    结账 Websync On-Demand

        9
  •  1
  •   ceejayoz    15 年前

    nginx web服务器刚刚推出了一个新模块,允许Comet使用任何语言,包括PHP。

    http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/

        10
  •  1
  •   sroussey    15 年前

    你必须用PHP创建自己的服务器。使用Apache/mod_php甚至fastcgi根本无法扩展。几岁,但可以让你开始:

    PHP Comet服务器: http://sourceforge.net/projects/comet/

        11
  •  0
  •   benlumley    16 年前