如何从 PHP 控制器发出 socket.io 事件?

发布于 2025-01-09 19:42:37 字数 1707 浏览 0 评论 0原文

我正在使用 Yii2 框架开发一个 PHP 网站,并尝试实现一个 socket.io 服务。

要执行 socket.io,我使用 PM2,我的文件如下所示:

const { fstat } = require('fs');
var socket = require('socket.io'),
    express = require('express'),
    https = require('https');
    fs = require('fs');

const credentials = {
    key: fs.readFileSync('../../../ssl/keys/<path_to_cert_key.key>').toString(),
    cert: fs.readFileSync('../../../ssl/certs/<path_to_cert.crt>').toString(),
}

var app = express();
var server = https.createServer(credentials, app);
var io = socket(server, {
    cors: {
        origin: '<origin_url>',
        methods: ['POST', 'GET'],
        credentials: true
    },
    allowEIO3: true,
    secure: true
});

io.sockets.on('connection', function(client){
    console.log('ok');
    client.on('test', function(data){
        console.log('test');
        console.log(data);
        io.sockets.emit('test_r', {message: 'ok'});
    });
});

server.listen(30064); 

它运行时没有任何错误:

pm2 start _socket.js

我可以通过注册 javascript 轻松地从视图访问此套接字:

var socket = io.connect('<socket_url:port>', {
    withCredentials: false,
});

socket.on('test_r', function( data ) {
     console.log('it works');
});

如果我连接到套接字并从视图发出,它会很好地工作。 但问题是我想从 PHP 控制器或 PHP 函数中的 CoreBootstrap 对象发出一个事件,如下所示:

$emitter = new \SocketIO\Emitter( array( 'port' => '30064', 'host' => '127.0.0.1') );
$emitter->broadcast->emit( 'test', ['message' => 'test_message'] );

我使用的模块是 ashiina/socket.io-emitter (我也尝试了很多其他方法,但是他们也没有工作)。 当我这样做时什么也没有发生。当我查看 PM2 日志时,什么也没有发生。

有人知道为什么没有发出事件或者是否有其他方法可以做到这一点?

预先感谢您的回答。

I'm developping a PHP website using the Yii2 Framework and I'm trying to implement a socket.io service.

To execute socket.io I use PM2 and my file looks like this :

const { fstat } = require('fs');
var socket = require('socket.io'),
    express = require('express'),
    https = require('https');
    fs = require('fs');

const credentials = {
    key: fs.readFileSync('../../../ssl/keys/<path_to_cert_key.key>').toString(),
    cert: fs.readFileSync('../../../ssl/certs/<path_to_cert.crt>').toString(),
}

var app = express();
var server = https.createServer(credentials, app);
var io = socket(server, {
    cors: {
        origin: '<origin_url>',
        methods: ['POST', 'GET'],
        credentials: true
    },
    allowEIO3: true,
    secure: true
});

io.sockets.on('connection', function(client){
    console.log('ok');
    client.on('test', function(data){
        console.log('test');
        console.log(data);
        io.sockets.emit('test_r', {message: 'ok'});
    });
});

server.listen(30064); 

It runs without any error:

pm2 start _socket.js

I can easily access this socket from a view by registering javascript :

var socket = io.connect('<socket_url:port>', {
    withCredentials: false,
});

socket.on('test_r', function( data ) {
     console.log('it works');
});

It works well if I connect to the socket and emit from a view.
But the thing is that I want to emit an event from a PHP Controller or from a CoreBootstrap Object in a php function like this :

$emitter = new \SocketIO\Emitter( array( 'port' => '30064', 'host' => '127.0.0.1') );
$emitter->broadcast->emit( 'test', ['message' => 'test_message'] );

The module I'm using is ashiina/socket.io-emitter (I also tried a bunch of ohters but they did not work as well).
Nothing happens when I do this. Nothing even happens when I look at the PM2 logs.

Would someone know why the event is not emitted or if there is another way to do it ?

Thanks in advance for your answers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文