Лучший подход для (кросс-платформенной) потоковой передачи данных в реальном времени в PHP? - PullRequest
7 голосов
/ 21 декабря 2010

Мне было интересно, как сделать "истинную" (полу) потоковую передачу данных в реальном времени с помощью PHP.

Возможные приложения: чаты, аукционы, игры и т. Д.

Под "истиной" я подразумеваю, что данные не просто записываются где-то и непрерывно опрашиваются, но фактически как-то передаются клиенту.

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

Для связи между клиентом и сервером я хотел бы придерживаться простого HTTP (AJAX), а не какого-либо другого протокола.

Потоковая передача на клиент с HTTP возможна путем ручной очистки буфера вывода.

Вопрос в том, к чему подключить этот скрипт на стороне сервера?

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

Расширение разделяемой памяти (shmop) будет работать, но оно не кроссплатформенное.

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

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 11 января 2011

PHP не очень подходит для реализации потоковой передачи данных в реальном времени.PHP очень медленный и не предназначен для создания многопоточных приложений.Вы бы лучше внедрили полнофункциональный сервер сокетов на языке, таком как Python или Java.

Тем не менее, я очень рекомендую проверить NodeJS: http://nodejs.org/

Он использует асинхронныйоснованная на событиях модель для ввода / вывода, вместо того, чтобы иметь блок потоков в цикле событий.Серверы NodeJS написаны на Javascript.NodeJS быстр, масштабируется и имеет низкую кривую обучения.

Клиенты будут подключаться к HTTP-серверу NodeJS с помощью длинных запросов Ajax опроса.PHP может подключаться к NodeJS напрямую и отправлять уведомления.Или PHP может записывать в очередь сообщений или базу данных, memcache и т. Д., А NodeJS будет опрашивать эти хранилища данных на предмет обновлений и отправлять новые сообщения клиентам.

Возможно, вам потребуется написать собственный демон, который будет служитьпереход от NodeJS к MySQL, memcached и т. д. при опросе обновлений.NodeJS будет держать сокет открытым с помощью процесса-демона.Процесс-демон будет опрашивать хранилища данных на предмет обновлений и отправлять обновления в NodeJS.HTTP-сервер NodeJS затем отправит эти обновления клиентам.

См. Это руководство для реализации потока Twitter в реальном времени: http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/

2 голосов
/ 21 декабря 2010

Если вы используете HTML и Javascript, то вам нужны WebSockets.Если это Flash или что-то еще, то обычные сокеты TCP.

Идея любого из них заключается в том, что вы запускаете файл сервера (написанный на PHP), который ожидает подключения.После подключения к одному или нескольким клиентам данные могут передаваться в обоих направлениях.Есть несколько проектов PHP WebSocket.Проверьте это:

http://code.google.com/p/phpwebsocket

Существует также инфраструктура под названием Skeleton, в которую я внес свой вклад, со встроенной библиотекой сервера WebSocket. Хотя все еще в нестабильной стадии.1008 *

http://code.google.com/p/skeleton

К сожалению, WebSockets все еще является новой технологией, поэтому они не поддерживаются повсеместно.Как упоминал @Christian, вы можете использовать библиотеку Socket.IO.

0 голосов
/ 21 декабря 2010

Если вы хотите общаться между PHP и другим языком (например, приложением C ++), возможно, вы захотите изучить Apache Thrift (http://thrift.apache.org/). Apache Thrift широко используется в Facebook для «разработки масштабируемых кросс-языковых сервисов».".

Редактировать: Я бы, вероятно, использовал Apache Thrift для связи с приложением Twisted , прослушивающим порт 80, и чтобы браузеры подключались к приложению Twisted с помощью длинного опроса или веб-сокета.Возможно, вы захотите взглянуть и на Socket.IO , это кросс-браузерная реализация веб-сокетов, предназначенная для приложений реального времени.

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

  • Christian
...