Задать вопрос
@BloodVIRUS

Как из стороннего php скрипта отправить сообщение на сокетсервер SocketIO?

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

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

А теперь по реализации. Я остановился на SocketIO, там буквально в несколько строчек поднимается сам сокет сервер. На странице "чата" так же довольно просто поднимается жс клиент этого сокет сервера. В общем то все работает, почти как часики, пользователи в онлайне совместно выполняют какие-то действия. Теперь передо мной встала задача, средствами php отправить на сокет сервер данные. И вот тут я разбиваюсь об мои знания и гугл. Я не смог найти никакой возможности из стороннего php отправить на php сервер какое-то сообщение. Единственное что я нашел для этого - elephant.io, но эта штучка не работает. Коннект к сокет серверу идет, и на этом либа умирает (пхп зависает и не умирает само, данные не идут). Ковырял и так и эдак - не хочет.

Остается единственный вариант, который мне кажется костылем. Подключать на каждую страницу жс, который будет дублировать в сокет действия. Что довольно неудобно, криво, и не красиво.

Может быть я не туда смотрю? Может быть все проще, чем кажется?
  • Вопрос задан
  • 395 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@davidnum95
Смысл в том чтобы из php отправить пост запрос на ноду. Ниже самая простая реализация.
На стороне socket.io что то типа такого:
// Пишем хэндлер пост запроса
app.post('/notify',  function (req, res) {
  const userIds = req.body.user_ids; // берем из body список пользователей, которым нужно отправить уведомление
  const data = req.body.data; // уведомление
  userIds.forEach(userId => {
     // проверяем что пользователь онлайн
     if (io.sockets.connected[userId] !== undefined) {
      // отправляем ему уведомление
      io.sockets.connected[userId].emit('event',  data);
    }
  });
  res.json({ status: 'OK' });
});

На стороне php просто отправляем пост запрос любым http клиентом на хост ноды (POST localhost:8000/notify).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы