PHP向Node/Socket.IO服务器发送消息

Jus*_*tin 8 php sockets node.js socket.io

我不太确定我是否会以正确的方式解决这个问题.我想坚持使用我的Socket.IO服务器,并且不想在节点内创建单独的HTTP服务器.有了这个,我可以创建一个PHP客户端,可以直接将数据(例如:玩家从在线商店购买物品)发送到节点Socket.IO服务器吗?

我从这开始:

<?php

class communicator {
   public function connect($address, $port){
      $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

      if($socket){
          try {
              socket_connect($socket, $address, $port);
          } catch(Exception $e){
              throw new Exception($e->getMessage());
          }
      }else{
          throw new Exception('Could not create socket.');
      }
}

?>
Run Code Online (Sandbox Code Playgroud)

套接字似乎可以很好地连接到节点服务器,但是如何直接从PHP客户端开始接收数据呢?

例如:假设我socket_write用来向服务器发送消息.我如何通过Socket.IO获得它?

希望我的问题有道理!

use*_*820 7

我进行了大量搜索,最终找到了一个相对简单的解决方案。

这不需要任何其他PHP库-它仅使用套接字。

与其尝试像许多其他解决方案一样尝试连接到websocket界面,不如连接到node.js服务器并用于.on('data')接收消息。

然后,socket.io可以将其转发给客户端。

像这样在Node.js中检测来自PHP服务器的连接:

//You might have something like this - just included to show object setup
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

server.on("connection", function(s) {
    //If connection is from our server (localhost)
    if(s.remoteAddress == "::ffff:127.0.0.1") {
        s.on('data', function(buf) {
            var js = JSON.parse(buf);
            io.emit(js.msg,js.data); //Send the msg to socket.io clients
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

这是令人难以置信的简单php代码-我将其包装在一个函数中-您可能会想出更好的东西。

请注意,这8080是我的Node.js服务器的端口-您可能需要更改。

function sio_message($message, $data) {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $result = socket_connect($socket, '127.0.0.1', 8080);
    if(!$result) {
        die('cannot connect '.socket_strerror(socket_last_error()).PHP_EOL);
    }
    $bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
    socket_close($socket);
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样使用它:

sio_message("chat message","Hello from PHP!");

您还可以发送转换为json并传递给客户端的数组。

sio_message("DataUpdate",Array("Data1" => "something", "Data2" => "something else"));

这是一种“信任”客户端从服务器获取合法消息的有用方法。

您还可以让PHP传递数据库更新,而无需让数百个客户端查询数据库。

我希望能早点找到它-希望对您有所帮助!

后期编辑:不确定这是否是必需的,但是我将其添加到了我的http.conf(Apache配置)中:

我认为我会将代码放在这里,以防它对任何人有帮助。

在httpd.conf中,我添加了以下代码:

RewriteEngine On
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule .* ws://localhost:8080%{REQUEST_URI} [P]

ProxyRequests Off
ProxyPass        /socket.io http://localhost:8080/socket.io retry=0
ProxyPassReverse /socket.io http://localhost:8080/socket.io retry=0

ProxyPass "/node" "http://localhost:8080/"
Run Code Online (Sandbox Code Playgroud)


Tho*_*son 3

我使用http://elephant.io/进行php和socket.io之间的通信,我唯一的问题是建立连接的时间,3或4秒才能完成发送数据。

<?php

require __DIR__ . '/ElephantIO/Client.php';
use ElephantIO\Client as ElephantIOClient;

$elephant = new ElephantIOClient('http://localhost:8080', 'socket.io', 1, false, true, true);

$elephant->init();
$elephant->emit('message', 'foo');
$elephant->close();
Run Code Online (Sandbox Code Playgroud)