Использование comet с PHP?


Я думал о реализации чата в реальном времени с использованием бэкэнда PHP, но я наткнулся на этот комментарий на сайте, обсуждающем comet:

Я понимаю, что PHP-это ужасный язык для Кометы, потому что Комета требует, чтобы вы сохранили постоянное соединение открыто для каждого клиент браузера. Используя mod_php, который этот означает связывание ребенка Apache полный рабочий день для каждого клиента, который совсем не масштабируется. Народ я знайте, что кометные вещи в основном используя переплетенный Python, который разработан обрабатывать сотни или тысячи одновременное подключение.

Это правда? Или это что-то, что можно настроить вокруг?

11 82

11 ответов:

соглашаясь / расширяя то, что уже было сказано, я не думаю, что FastCGI решит проблему.

Apache

каждый запрос в Apache будет использовать один рабочий поток до завершения запроса, что может занять много времени для запросов COMET.

эта статья на Ajaxian упоминает использование COMET на Apache, и это трудно. Проблема не специфична для PHP и применяется к любому базовому модулю CGI, который вы можете использовать Апаш.

предлагаемое решение было использовать 'event' MPM модуль что изменяет способ отправки запросов в рабочие потоки.

этот MPM пытается исправить проблема "сохранить жизнь" в HTTP. После того, как клиент завершает первый запрос, клиент может держать соединение открыть, и отправить дальше запросы с использованием того же сокета. Этот смогите сохранить значительные накладные расходы внутри создание TCP-соединения. Однако, Apache традиционно держит целый дочерний процесс / поток, ожидающий данных от клиента, который приносит свои ущерб. Чтобы решить эту проблему, этот MPM использует выделенный поток для отрегулируйте оба слушая гнезда, и все розетки, которые находятся в Keep Alive государство.

к сожалению, это тоже не работает, потому что это будет только "повтор"после запрос завершен, ожидая нового запроса от клиента.

PHP

теперь, учитывая другую сторону проблемы, даже если вы решите проблему с задержкой одного потока на запрос comet, вам все равно понадобится один поток PHP на запрос - вот почему FastCGI не поможет.

нужно что-то вроде продолжения которые позволяют кометным запросам возобновляться, когда наблюдается событие, по которому они запускаются. AFAIK, это не то, что возможно в PHP. Я видел его только на Java-см. Apache Tomcat сервер.

Edit:

здесь статью об использовании балансировщика нагрузки (HAProxy), чтобы вы могли запускать как сервер apache, так и сервер с поддержкой comet (например, jetty, tomcat для Java) на порту 80 того же сервера.

вы можете использовать Nginx и JavaScript для реализации системы чата на основе Comet, которая очень масштабируема с небольшим использованием памяти или процессора.

У меня есть очень простой пример, который поможет вам начать. Он охватывает компиляцию Nginx с модулем NHPM и включает в себя код для простых ролей издателя/подписчика в jQuery, PHP и Bash.

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

PHP

Я нашел это смешным немного видеоролики объясняя простые кометы. В качестве примечания я действительно думаю, что это убьет ваш сервер при любой реальной нагрузке. Когда просто есть несколько пользователей, я бы сказал, чтобы просто пойти на это решение. Это решение очень просто реализовать (скринкасты занимают всего 5 минут вашего времени :)). Но, как я уже говорил ранее, я не думаю, что это хорошо для многих одновременных пользователей(думаю, вы должны проверить его ;)) потому что:

  1. он использует файловый ввод-вывод, который намного медленнее, чем просто получение данных из памяти. Как, например, функции filemtime(),
  2. во-вторых, но я не думаю, что у PHP нет достойной модели потока. PHP не был разработан для этого в любом случае из-за share nothing model. Как говорится в слайдах, "общие данные выталкиваются на уровень хранилища данных", например, MySQL.

варианты

Я действительно думаю, вы должны попробовать альтернативы, если вы хотите сделать любой кометы/длинный опрос. Вы можете использовать много языков, например:

  • Java/JVM: Jetty продолжения.
  • питон: slosh.
  • Erlang: популярный язык для comet / etc.
  • Lua, Ruby, C, Perl просто назвать несколько.

просто выполняя простой поиск google, покажет вам много альтернатив также PHP(который я думаю любая большая нагрузка убьет ваш сервер).

mod_php-это не единственный способ использования PHP. Вы можете использовать FastCGI. PHP должен быть скомпилирован с --enable-fastcgi.

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

вы также можете попробовать https://github.com/reactphp/react

React-это низкоуровневая библиотека для событийного программирования на PHP. В его основе лежит цикл событий, поверх которого он предоставляет низкоуровневые утилиты, такие как: абстракция потоков, асинхронный DNS-решатель, сетевой клиент/сервер, http-клиент/сервер, взаимодействие с процессами. Сторонние библиотеки могут использовать эти компоненты для создания асинхронных сетевых клиентов/серверов и многое другое.

событие цикл основан на шаблоне реактора (отсюда и название) и сильно вдохновлен такими библиотеками, как EventMachine (Ruby), Twisted (Python) и Node.js (V8).

вводный пример показывает простой HTTP-сервер, прослушивающий порт 1337:

<?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();

У меня похожая проблема. Один из вариантов, который я нахожу интересным, - использовать существующий сервер Comet, такой как cometd-java или cometd-python, в качестве основного центра сообщений. Ваш PHP-код тогда просто клиент для сервера Comet - он может отправлять или читать сообщения из каналов, как и другие клиенты.

есть интересный фрагмент кода, связанный здесь:http://morglog.org/?p=22=1 который реализует часть этого метода (хотя есть биты кода отладки разбросаны вокруг, слишком.)

в настоящее время я реализую масштабируемый PHP-сервер Comet с использованием функций сокета. Он называется 'phet' ([ph]P com[et] )

страница проекта:http://github.com/Tim-Smart/phet

бесплатно присоединиться к разработке. В настоящее время мне удалось выполнить большую часть логики сервера, просто нужно закончить работу на стороне клиента.

EDIT: Недавно добавленные возможности "многопоточности" с использованием pcntl_fork способ :)

вам будет трудно реализовать comet в PHP, просто из-за присущей ему однопоточной природы.

проверить Websync On-Demand - сервис позволяет интегрировать PHP через публикацию на стороне сервера, разгружая тяжелые параллельные соединения, и позволит вам создать приложение чата в режиме реального времени в кратчайшие сроки.

новый модуль только что вышел для веб-сервера nginx, который позволит Comet с любым языком, включая PHP.

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

вам придется создать свой собственный сервер в PHP. Использование Apache / mod_php или даже fastcgi не будет масштабироваться вообще. Несколько лет, но вы можете начать:

PHP-Comet-Server: http://sourceforge.net/projects/comet/

Я думаю, что это больше проблема, что имея много потоков apache работает все время является проблемой. Это будет существовать с любым языком, если он работает через apache так же, как и PHP (обычно).