Использование кометы с PHP?

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

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

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

Ответ 1

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

Apache

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

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

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

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

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

PHP

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

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

Edit:

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

Ответ 2

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

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

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

Ответ 3

PHP

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

  • Он использует файловый ввод-вывод, который намного медленнее, чем просто получение данных из памяти. Например, функции filemtime(),
  • Во-вторых, но я не думаю, что в PHP нет хорошей модели потоков. PHP не был разработан для этого в любом случае из-за обмениваться ничейной моделью. Как и слайды, "общие данные переносятся на уровень хранилища данных", например, MySQL.

Альтернативы

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

  • Java/JVM: Jetty continuations.
  • Python: Dustin slosh.
  • Erlang: популярный язык для кометы и т.д.
  • Lua, Ruby, C, Perl, чтобы назвать несколько.

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

Ответ 4

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

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

Ответ 5

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

React - низкоуровневая библиотека для управляемых событиями программирования в PHP. По сути, это цикл событий, над которым он предоставляет низкоуровневые утилиты, такие как: абстракция потоков, async dns resolver, сетевой клиент/сервер, http client/server, взаимодействие с процессами. Сторонние библиотеки могут использовать эти компоненты для создания асинхронных сетевых клиентов/серверов и т.д.

Цикл событий основан на шаблоне реактора (отсюда и название) и сильно вдохновлен такими библиотеками, как 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();

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

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

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

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

Ответ 10

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

PHP-Comet-сервер: http://sourceforge.net/projects/comet/

Ответ 11

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