Что более эффективно для отправки обновлений WebSocket с изменением базы данных MySQL

В настоящее время я экспериментирую с WebSockets, чтобы уменьшить / удалить необходимость в постоянных запросах AJAX в среде с низкой пропускной способностью. Все устройства совместимы с WebSocket, поэтому там нет проблем, и я пытаюсь сохранить его на родных PHP WebSockets, без node.js или других фреймворков / библиотек (которые до сих пор были прекрасными).

То, что я хочу сделать, – это решить, как сообщать связанным клиентам об обновлении базы данных другим клиентом. В рассматриваемом случае речь идет о том, что человек нажимает кнопку на своем устройстве, а затем предупреждает о том, что управляющий (-ы) этого человека нажимает. Итак, у меня есть два варианта:

1. Заполнение запроса базы данных (PHP)

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

2. Отправка уведомления от Клиента

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

$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code { if(Result == "Successful") { SendWebSocketNotification(OtherData); } } 

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

3. MySQL Trigger?

Это просто догадка, но, возможно, еще один вариант – создать триггер MySQL, который может как-то сразу уведомить файл server.php? Я понятия не имею, как это будет работать, и опасно предположить, что это может привести к тем же или похожим требованиям Query, что и решение # 1, но это просто …

Заранее спасибо за вашу помощь 🙂

EDIT: возможность решения 4

На самом деле появилась другая мысль, в которой PHP-файл, используемый для обновления базы данных, может иметь встроенное в него сообщение WebSocket. Таким образом, когда PHP-файл обновляет базу данных, сервер WebSocket уведомляется через PHP, возможно ли это?

Если вы используете websockets, вы должны использовать уведомления от клиента. Это один из их основных вариантов использования.

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


Обновление. Наверное, я понял, что ваш первоначальный вопрос немного неправильный. Если я правильно понимаю ваш случай использования: вы отправляете обновления базы данных с клиента, и после этого все подключенные клиенты должны быть обновлены. В этом случае я думаю, что сервер должен отправить сообщения об обновлении после того, как будут выполнены обновления БД, поэтому я согласен с решением 4. Я предполагаю, что ваш сервер веб-сервера – это тот же сервер, на котором работает PHP, и выполняет обновления БД.

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


Обновление 2: теперь стало понятно, что вы действительно используете отдельный автономный сервер websocket. В основном у вас есть два разных веб-сервера на стороне сервера и возникают проблемы с тем, как общаться между ними. Это настоящая проблема, и я бы рекомендовал использовать только один сервер за раз – либо взгляните на поддержку веб-поддержки Apache (экспериментальную, и не очень рекомендуемую), либо на перенос ваших php-скриптов в экземпляр websocket.

Ни PHP, ни Apache не были действительно построены с учетом веб-узлов. Очень просто настроить автономный сервер websocket, используя только PHP, но может быть не так просто, чтобы перенести остальную часть PHP-стека на него, если код полагается на Apache / веб-сервер. Поддержка веб-поддержки Apache также вряд ли оптимальна. К сожалению, для реального решения для веб-раскладки наилучшей практикой будет использование технологии, созданной для нее с нуля.

Лучшим ответом является отправка уведомлений через серверную сторону, когда база данных обновляется скриптом PHP, поэтому сценарий должен добавлять параметры веб-сокетов для прямой отправки уведомлений всем зарегистрированным клиентам сокетов. Как делает сайт социальной сети http://www.funnenjoy.com .

 User send content->Php script process content and save data according to true condition->check database is updated by checking return of mysql_query/other alternative->if true than use web-socket and send notification to all users 

теперь это более просто / удобно / сберегательная заставка.