Как из стороннего php скрипта отправить сообщение на сокетсервер SocketIO?
Здравствуйте. Уже практический пятый день я ковыряюсь, и разбиваюсь о стены гугла с довольно нетривиальным вопросом. Опишу сейчас задачу, как я ее реализовал, и с чем я столкнулся, что не получается сделать.
Я постараюсь избежать много букв и описания всего функционала проекта, по этому я просто интерпретирую все его возможности на чате. Будем считать что я делаю очень сложный онлайн чат. Пользователи должны в режиме реального времени на одной странице иметь возможность коллективно выполнять какие-то действия. Пусть это будет текстовое общение. Но с некоторыми нюансами, если какого-то пользователя с совершенно другой страницы назначили админом - у него прямо там должны измениться права, и все участники чата должны это отразить.
А теперь по реализации. Я остановился на SocketIO, там буквально в несколько строчек поднимается сам сокет сервер. На странице "чата" так же довольно просто поднимается жс клиент этого сокет сервера. В общем то все работает, почти как часики, пользователи в онлайне совместно выполняют какие-то действия. Теперь передо мной встала задача, средствами php отправить на сокет сервер данные. И вот тут я разбиваюсь об мои знания и гугл. Я не смог найти никакой возможности из стороннего php отправить на php сервер какое-то сообщение. Единственное что я нашел для этого - elephant.io, но эта штучка не работает. Коннект к сокет серверу идет, и на этом либа умирает (пхп зависает и не умирает само, данные не идут). Ковырял и так и эдак - не хочет.
Остается единственный вариант, который мне кажется костылем. Подключать на каждую страницу жс, который будет дублировать в сокет действия. Что довольно неудобно, криво, и не красиво.
Может быть я не туда смотрю? Может быть все проще, чем кажется?
Пытался, пользовался, не работает. Если сервер я запускаю без SSL то клиент просто висит, секунд 60, потом умирает. На сервер подключения нет
Если же я возвращаю SSL, то клиент исполняется за секунду, а в консоли сервера сыпятся ошибки:
Press Ctrl+C to stop. Start success.
PHP Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol in /var/www/ws/vendor/workerman/workerman/Connection/TcpConnection.php on line 729
Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol in /var/www/ws/vendor/workerman/workerman/Connection/TcpConnection.php on line 729
SSL Handshake fail as server.
Buffer:6c6973680d0a2431370d0a736f636b65742e696f23656d69747465720d0a2436380d0a9283a47479706502a46461746192ab6f74686572206576656e74a9737563682064617461a36e7370a12f82a5726f6f6d7390a5666c61677381a962726f616463617374c30d0a
Примерно та же ситуация с elephant.io. Если сервер крутится по SSL - клиент конектится и моментально умирает, если же сервер без SSL - клиент виснет, секунд на 60, и умирает. В консоле ошибок никаких..
miki131, Через редис? там есть пример чистого пхп, или я не так понял?
// Below initialization will create a phpredis client, or a TinyRedisClient depending on what is installed
$emitter = new SocketIO\Emitter(array('port' => '6379', 'host' => '127.0.0.1'));
// broadcast can be replaced by any of the other flags
$emitter->broadcast->emit('other event', 'such data');
miki131, поставил редис, все равно не едет. Сокетио крутится на SSL, при попытке исполнения php этого эммитера я в консоле сокета вижу:
PHP Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol in /var/www/ws/vendor/workerman/workerman/Connection/TcpConnection.php on line 729
Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol in /var/www/ws/vendor/workerman/workerman/Connection/TcpConnection.php on line 729
SSL Handshake fail as server.
Buffer:4c4953480d0a2431370d0a736f636b65742e696f23656d69747465720d0a2435330d0a9283a47479706502a46461746192a56576656e74ab7061796c6f616420737472a36e7370a12f82a5726f6f6d7390a5666c616773900d0a
А в другой консольке:
/var/www/wsClient # php test.php
PHP Fatal error: Uncaught exception 'RedisException' with message 'read error on connection' in /var/www/wsClient/src/Emitter.php:131
Stack trace:
#0 /var/www/wsClient/src/Emitter.php(131): Redis->publish('socket.io#emitt...', '???type??data??...')
#1 /var/www/wsClient/test.php(9): SocketIO\Emitter->emit('event', 'payload str')
#2 {main}
thrown in /var/www/wsClient/src/Emitter.php on line 131