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

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

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

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

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

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

апаш

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

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

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

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

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

PHP

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

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

Редактировать:

Здесь есть статья о том, как использовать балансировщик нагрузки ( HAProxy ), чтобы вы могли запускать как сервер apache, так и сервер с кометами (например, 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

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

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

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

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

  • Java / JVM: продолжения Jetty.
  • Python: Дастин.
  • Erlang: популярный язык для кометы / и т. Д.
  • 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. По сути, это цикл событий, над которым он предоставляет низкоуровневые утилиты, такие как: абстракция потоков, 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(); 

У меня такая же проблема. Один из вариантов, который я нахожу интересным, – использовать существующий сервер 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 🙂

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

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

Новый модуль только что вышел для веб-сервера nginx, который позволит кометам с любым языком, включая 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 (обычно).