Я думал о реализации чата в реальном времени с использованием PHP-бэкенда, но наткнулся на этот комментарий на сайте, посвященном комете:
Насколько я понимаю, PHP - ужасный язык для Comet, потому что Comet требует, чтобы вы поддерживали постоянное соединение с каждым клиентом браузера. Использование mod_php означает постоянное привязывание дочернего Apache к каждому клиенту, который вообще не масштабируется. Люди, которых я знаю, занимающиеся Comet, в основном используют Twisted Python, который предназначен для обработки сотен или тысяч одновременных подключений.
Это правда? Или это что-то, что можно настроить вокруг?
Ответы:
Соглашаясь / расширяя то, что уже было сказано, не думаю, что FastCGI решит проблему.
Apache
Каждый запрос в Apache будет использовать один рабочий поток до тех пор, пока запрос не будет завершен, что может занять много времени для запросов COMET.
В этой статье об Ajaxian упоминается использование COMET на Apache, и это сложно. Проблема не является специфической для PHP и применима к любому внутреннему модулю CGI, который вы, возможно, захотите использовать в Apache.
Предлагаемое решение заключалось в использовании модуля MPM «событий», который изменяет способ отправки запросов рабочим потокам.
К сожалению, это тоже не работает, потому что он будет «откладывать» только после завершения запроса, ожидая нового запроса от клиента.
PHP
Теперь, учитывая другую сторону проблемы, даже если вы решите проблему с задержкой одного потока на запрос кометы, вам все равно понадобится один поток PHP на запрос - вот почему FastCGI не поможет.
Вам нужно что-то вроде Continuations, которое позволяет возобновлять запросы комет, когда наблюдается событие, по которому они инициированы. AFAIK, это невозможно в PHP. Я видел это только на Java - см. Сервер Apache Tomcat .
Редактировать:
Здесь есть статья об использовании балансировщика нагрузки ( HAProxy ), позволяющего запускать как сервер apache, так и сервер с поддержкой кометы (например, причал, 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 минут вашего времени :)). Но, как я уже говорил ранее, я не думаю, что это хорошо для большого количества одновременных пользователей (думаю, вам следует протестировать его;)), потому что:
filemtime()
,Альтернативы
Я действительно думаю, что вам следует попробовать альтернативы, если вы хотите провести какой-либо кометный / длинный опрос. Вы можете использовать много языков, например:
Простое выполнение простого поиска в 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
Вводный пример показывает простой 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 с использованием функций сокетов. Он называется фет ([ph] p com [et]).
Страница проекта: http://github.com/Tim-Smart/phet
Бесплатное участие в разработке. В настоящее время мне удалось выполнить большую часть логики сервера, просто нужно закончить работу на стороне клиента.
РЕДАКТИРОВАТЬ: недавно добавленные возможности многопоточности с использованием
pcntl_fork
метода :)источник
Вам будет сложно реализовать комету в 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 (обычно).
источник