Мне было интересно, как делать «истинные» (полу) потоки данных в реальном времени с помощью PHP.
Возможные приложения: чаты, аукционы, игры и т. Д.
Под «истинным» я имею в виду, что данные не просто где-то написаны и постоянно опрошены, но фактически потоки для клиента как-то.
Под «полу» я подразумеваю, что это нормально, если только поток от сервера к клиенту находится в режиме реального времени, а сообщения от клиента на сервер – нет.
Для связи между клиентом и сервером я хотел бы придерживаться простого HTTP (AJAX), а не другого протокола.
Потоковая передача клиенту с помощью HTTP возможна путем ручной очистки выходного буфера.
Вопрос в том, что подключить этот скрипт к серверу?
И как только он подключен, чтобы сделать блокировку прочитанной, а не опроса для изменений.
Расширение общей памяти (shmop) будет работать, но оно не является межплатформенным.
Возможно, memcached будет работать? Но я не уверен, есть ли способ сделать блокировку чтения, так что это снова сводится к опросу – хотя я уверен, что memcached довольно быстро, мне просто не нравится идея непрерывного опроса.
Есть идеи?
PHP не подходит для реализации потоковой передачи данных в реальном времени. PHP очень медленный и не предназначен для создания многопоточных приложений. Вам лучше реализовать полномасштабный сервер сокетов на языке Python или Java.
Тем не менее, я настоятельно рекомендую проверить NodeJS: http://nodejs.org/
Он использует асинхронную основанную на событиях модель для ввода-вывода, вместо того, чтобы блокировать потоки в цикле событий. Серверы NodeJS записываются в Javascript. NodeJS работает быстро, масштабируется и имеет низкую кривую обучения.
Клиенты будут подключаться к HTTP-серверу NodeJS, используя длинные запросы Ajax для опроса. PHP может напрямую подключаться к NodeJS и нажимать уведомления. Или PHP может писать в очередь сообщений или базу данных, memcache и т. Д., А NodeJS будет опробовать эти хранилища данных для обновлений и отправить новые сообщения клиентам.
Возможно, вам понадобится написать свой собственный демон для перехода между NodeJS и MySQL, memcached и т. Д. При опросе обновлений. NodeJS будет держать сокет открытым с процессом daemon. Процесс daemon будет опробовать хранилища данных для обновлений и отправить обновления в NodeJS. Затем HTTP-сервер NodeJS отправляет эти обновления клиентам.
См. Этот учебник для реализации потока в реальном времени Twitter: http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/
Если вы используете HTML и Javascript, вам нужны WebSockets. Если это Flash или что-то еще, то обычные TCP-сокеты.
Идея заключается в том, что вы запускаете файл сервера (написанный на PHP), который ждет соединений. Как только он подключен к одному или нескольким клиентам, данные могут быть нажаты в обоих направлениях. Есть несколько проектов PHP WebSocket. Проверьте это:
http://code.google.com/p/phpwebsocket
Существует также структура под названием «Скелет», в которую я вносил вклад, в нее встроена библиотека сервера WebSocket. Тем не менее, на нестабильных этапах.
http://code.google.com/p/skeleton
К сожалению, WebSockets по-прежнему являются новой технологией, поэтому они не поддерживаются повсеместно. Как отметил @Christian, вы можете использовать библиотеку Socket.IO.
Если вы хотите общаться между PHP и другим языком (например, с C ++-приложением), вы можете посмотреть в Apache Thrift ( http://thrift.apache.org/ ). Apache Thrift широко используется в Facebook для «масштабируемых межязыковых сервисов».
Редактирование: я бы, вероятно, использовал Apache Thrift для связи с Twisted- приложением, прослушивающим порт 80, и чтобы браузеры подключались к Twisted-приложению, используя либо длинный опрос, либо websocket. Вы также можете посмотреть в Socket.IO , это реализация веб-сокета в кросс-браузере, предназначенная для приложений реального времени.
В основном, у вас будет приложение, которое вы нажимаете на ваш Twisted web-сервер, используя Thrift, и затем передаете сообщение любым открытым соединениям.