Сервер PHP и веб-сокеты

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

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

А как насчет интервала. Обычно в приложении C # .NET exe я бы просто создал таймер. Как это можно было сделать в PHP ??

Если это все возможно, могу ли я просто запустить свой PHP-код на веб-сервере Apache?


person w00    schedule 16.03.2012    source источник
comment
websocket - это другой протокол, поэтому вы не можете запустить его через apache. По-видимому, есть github.com/disconnect/apache-websocket   -  person miki    schedule 16.03.2012


Ответы (1)


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

Вам нужен доступ к сокетам, которых обычно нет на общем сервере, поэтому вам придется купить себе VPS.

Вам нужно создать файл на своем сервере, который будет автоматически запускать ваш PHP-скрипт при каждой перезагрузке сервера. Обычно это делается путем помещения сценария оболочки, который запускает сценарий PHP, в /etc/init.d, а затем размещения символической ссылки на сценарий оболочки в /etc/rc5.d (при условии, что это ваш уровень по умолчанию).

Вы также, скорее всего, не захотите / не нуждаетесь в запуске Apache, если только вы не планируете использовать этот сервер в качестве файлового сервера. Если вы используете его исключительно для сервера сокетов, вам может потребоваться установить PHP-CLI. Это сэкономит вам память.

Если вы пытаетесь взаимодействовать в реальном времени между пользователями, подключенными к вашему серверу, возможно, вы вообще не захотите задействовать базу данных. На вашем сервере сокетов будет список всех подписчиков, подключенных к серверу сокетов, поэтому, когда один из них отправит вам сообщение, вы можете немедленно отправить это сообщение обратно всем подключенным подписчикам, не сохраняя ничего в медленной базе данных. В качестве альтернативы вы можете сохранить информацию в памяти, если можете себе это позволить.

Есть решение для сокетов, не поддерживаемых во всех браузерах, под названием socket.io. В основном я считаю, что он пытается настроить веб-сокет браузера, если он поддерживается, но если он не поддерживается, он запускает соединение с сокетом Flash. В любом случае вы используете один и тот же интерфейс для взаимодействия с ним.

Вы также можете рассмотреть другой язык для создания сервера сокетов. PHP на самом деле не создан для такого рода вещей. Лучшим языком для использования был бы Javascript, особенно если масштабируемость вызывает беспокойство. Node.js - это библиотека, которая позволит вам довольно легко построить сервер сокетов и будет намного более масштабируемой.

person dqhendricks    schedule 16.03.2012
comment
В моем случае база данных просто необходима. Я храню не все в базе данных, а только некоторые настройки. Когда один пользователь изменяет настройку, другой пользователь должен быть уведомлен как можно скорее. Поэтому я не думаю, что nodejs - это вариант для меня, когда мне нужна БД. Но запуск php-сервера в командной строке для меня звучит достаточно хорошо. Я посмотрю на это прямо сейчас - person w00; 16.03.2012
comment
node.js имеет встроенный доступ к базе данных с драйверами для MySql и Drizzle. Если другие пользователи должны быть уведомлены немедленно, зачем хранить это в базе данных? Почему бы просто не отправить эту информацию другим пользователям, как только один пользователь отправит вам сообщение. Серверы сокетов не похожи на веб-скрипты. Постоянно выполняется один экземпляр сценария, который используют все подключенные пользователи. Это означает, что пользователи могут обмениваться данными внутри переменных, мгновенно передавать друг другу сообщения и т. Д. - person dqhendricks; 16.03.2012