gpt4 book ai didi

php - 仅使用套接字将消息从 PHP 直接发送到 Node(没有 Redis 等)

转载 作者:可可西里 更新时间:2023-11-01 11:24:01 26 4
gpt4 key购买 nike

我使用 Redis 在 PHP 和 Node 之间建立了连接,工作正常,但我对在没有任何外部库和服务且仅使用套接字的情况下进行连接很感兴趣。

如果中间没有 Redis,我不确定性能会受到多大影响,但对于更简单的项目,使用更少的代码会很好。

我从 this answer 得到了大部分代码在 Using PHP with Socket.io但我不得不改变一些变量。但它没有按预期工作。

我尝试了使用和不使用 https,因为我将使用 https,但我尝试使用 http 制作一个更简单的示例以使其正常工作。

  • send.php 创建并写入套接字。我可以确认它已连接到 Node ,因为如果 Node 未运行,我会收到错误消息。
  • socket.js 不会在 console.logs 中返回任何内容。
  • socket-https.js 返回 来自::ffff:127.0.0.1 的连接 但未读取 socket.on('data')。我错过了什么?

我想我误解了 http 版本中的 var/require 部分。

谁能看出它为什么不起作用?

套接字.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var listener = app.listen(8080, function(){
console.log('Listening on port ' + listener.address().port);
});

http.on("connection", function(socket) {
console.log("connection");
if(socket.remoteAddress == "::ffff:127.0.0.1") {
console.log("connection from " + socket.remoteAddress);
socket.on('data', function(buf) {
var js = JSON.parse(buf);
console.log("on data: " + js); // Not working
});
}
});

socket-https.js

var fs = require('fs');
var privateKey = fs.readFileSync('my-domain-com.key', 'utf8');
var certificate = fs.readFileSync('my-domain-com.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var app = require('express')();
var https = require('https').createServer(credentials, app);
var io = require('socket.io')(https);

https.listen(8080, function(){
console.log('Server online');
});

https.on("connection", function(socket) {
console.log("connection"); // Works!
if(socket.remoteAddress == "::ffff:127.0.0.1") {
console.log("connection from " + socket.remoteAddress); // Works!
socket.on('data', function(buf) {
var js = JSON.parse(buf);
console.log("on data: " + js); // Not working :(
});
}
});

发送.php

sio_message("Message","Data");

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);
} else {
echo "Connected<br>";
}
$bytes = socket_write($socket, json_encode(Array("msg" => $message, "data" => $data)));
echo " $bytes bytes written";
socket_close($socket);
}

最佳答案

这可能与问题无关,但我最终不得不配置 Apache 来处理重写条件(我同时运行 Apache 和 Node.js)

我想我会把代码放在这里以防它对任何人有帮助。

在 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/"

也许缺少那个是个问题?我不确定 -/node 也成为指向 node.js 服务器的直接链接。

关于php - 仅使用套接字将消息从 PHP 直接发送到 Node(没有 Redis 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53689391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com