在 Socket.io 中使用 PHP

是否有可能在客户端使用 Sockets.io 并与服务器上基于 PHP 的应用程序进行通信?PHP 是否支持这种“长期连接”的代码编写方式?

我为 socket.io 找到的所有示例代码似乎都是针对服务器端的 node.js 的,因此没有帮助。

232798 次浏览

呃,为什么要这样做呢? 把 PHP 放在后端,NodeJS/Sockets 做它的非阻塞事情。

这里有一些东西可以让你开始: http://groups.google.com/group/socket_io/browse_thread/thread/74a76896d2b72ccc

就我个人而言,我有一个明确监听来自 PHP 的交互的端点的快速运行。

例如,如果我向用户发送了一封电子邮件,我希望 socket.io 向用户显示一个实时通知。

想要从 socket.io 到 php 的交互,你可以这样做:

var http = require('http'),
host = WWW_HOST,
clen = 'userid=' + userid,
site = http.createClient(80, host),
request = site.request("POST", "/modules/nodeim/includes/signonuser.inc.php",
{'host':host,'Content-Length':clen.length,'Content-Type':'application/x-www-form-urlencoded'});


request.write('userid=' + userid);
request.end();

说真的,PHP 非常适合做服务器端的事情,让它与连接,它没有地方在这个领域现在。为什么要做任何长轮询时,你有网络插座或闪光插座。

现在回答这个问题可能有点晚了,但是我发现。

我不想讨论节点是否比 php 做得更好,这不是重点。

解决方案是: 我还没有找到任何针对 PHP 的 socket.io 实现。

但是有一些实现 WebSockets的方法。这个 jQuery 插件允许您在使用 Websockets 的同时优雅地降低对不支持的浏览器的支持。在 PHP 方面,有一个 这门课,它似乎是最广泛用于 PHP WS 服务器的。

对于您提到的“长期连接”,您可以使用用于 PHP 的 Ratchet。它是基于自 PHP5以来 PHP 一直支持的 StreamSocket 函数构建的库。

对于客户端,您需要使用 HTML5支持的 WebSocket,而不是 Socket.io (因为您知道,Socket.io 只能与 node.js 一起工作)。

如果你仍然想使用 Socket.io,你可以这样试试: - 查找并获取 socket.io.js 供客户使用 - 和 Ratchet 一起模拟 Socket.io 在服务器上的工作方式

希望这个能帮上忙!

如果您想使用 socket.io 和 php,这可能是您的答案!

工程项目网址:

大象

他们也在 github 上:

Https://github.com/wisembly/elephant.io

Io 提供了一个完全用 PHP 编写的 socket.io 客户机,应该可以在项目的任何地方使用。

它是一个简单易用的库,旨在通过 socket.io 和 websockets 为 PHP 应用程序提供一些实时功能,用于完整的 javascript 无法完成的操作。

例子从项目网站(通过 php 与 websocket 服务器通信)

Php 服务器

use ElephantIO\Client as Elephant;


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


$elephant->init();
$elephant->send(
ElephantIOClient::TYPE_EVENT,
null,
null,
json_encode(array('name' => 'foo', 'args' => 'bar'))
);
$elephant->close();


echo 'tryin to send `bar` to the event `foo`';

套接字输入输出服务器

var io = require('socket.io').listen(8000);


io.sockets.on('connection', function (socket) {
console.log('user connected!');


socket.on('foo', function (data) {
console.log('here we are in action event and data is: ' + data);
});
});

我还没有尝试过,但你应该能够做到这一点与 ReactPHP和这个 插座组件。看起来很像 Node,但是在 PHP 中。

这个怎么样?PHPSocketio?它是一个 socket.io php 服务器端替代品。事件循环基于 pecl 事件扩展。虽然我自己也没试过。

更新: 2014年8月 当前的 Socket.io v1.0站点有一个 PHP 示例:-< a href = “ https://github.com/rase-/socket.io-PHP-emitter”> https://github.com/rase-/socket.io-PHP-emitter

如果您真的希望使用 PHP 作为 socket.io 的后端,以下是我的发现。 两个 socket.io php 服务器端备选方案。

Https://github.com/walkor/phpsocket.io

Https://github.com/rickysu/phpsocket.io

像这样的第一个存储库的示例代码。

use PHPSocketIO\SocketIO;


// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
$socket->on('chat message', function($msg)use($io){
$io->emit('chat message', $msg);
});
});

我一直在寻找一种非常简单的方法,让 PHP 向客户机发送 socket.io 消息。

这不需要任何额外的 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
});
}
});

下面是非常简单的 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);
}

你可以这样使用它:

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

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

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

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

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

我知道那个挣扎的人! 但是我最近几乎和 Workerman 一起工作。 如果您还没有偶然发现这个 PHP 框架,那么您最好检查一下!

Workerman 是一个异步事件驱动的 PHP 框架,用于轻松构建快速、可伸缩的网络应用程序。(我只是复制和粘贴从他们的网站 hahahahhttp://www.workerman.net/en/)

解释这一点的简单方法是,当涉及到网络套接字编程,所有你真正需要的是有2个文件在您的服务器或本地服务器(无论您在工作)。

  1. Php (将响应所有客户机请求的源代码)

  2. Client.php/client.html (执行请求操作的源代码)

因此,基本上,您可以首先在 Server.php上正确编写代码,然后启动服务器。通常,由于我使用的 windows 增加了更多的麻烦,我通过这个命令运行服务器—— > < em > php server.php start

如果您使用的是 xampp。只有一个办法。去你想放文件的地方。在我们的案子里,我们要把文件放进去

C:/xampp/htdocs/websocket/server.php

C:/xampp/htdocs/websocket/client.php or client.html

假设您的本地服务器中已经存在这些文件。打开您的 Git Bash 或命令行或终端或任何您正在使用的,并在这里下载 php 库。

Https://github.com/walkor/workerman

Https://github.com/walkor/phpsocket.io

我通常通过作曲家下载,只是在我的 php 脚本自动加载这些文件。

再看看这个。这真的是 很重要!您需要这个 javascript 库,以便在运行 Client.php或 client.html 时与 Server.php进行通信。

Https://github.com/walkor/phpsocket.io/tree/master/examples/chat/public/socket.io-client

我只是将 socket.io-client 文件夹复制粘贴到 server.php 和 client.php 的同一级别上

下面是 Server.php源代码

<?php
require __DIR__ . '/vendor/autoload.php';


use Workerman\Worker;
use PHPSocketIO\SocketIO;


// listen port 2021 for socket.io client
$io = new SocketIO(2021);
$io->on('connection', function($socket)use($io){
$socket->on('send message', function($msg)use($io){
$io->emit('new message', $msg);
});
});


Worker::runAll();

这是 Client.php或者 客户的源代码

<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div id="chat-messages" style="overflow-y: scroll; height: 100px; "></div>
<input type="text" class="message">
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="socket.io-client/socket.io.js"></script>
<script>
var socket = io.connect("ws://127.0.0.1:2021");


$('.message').on('change', function(){
socket.emit('send message', $(this).val());
$(this).val('');
});


socket.on('new message', function(data){
$('#chat-messages').append('<p>' + data +'</p>');
});
</script>
</html>

再次打开您放置 server.php 文件的命令行或 gitbash 或终端。在我们的示例中,是 C:/xampp/htdocs/websocket/,键入 < em > php server.php start 并按 Enter。

然后进入浏览器,键入 翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳翻译: 奇芳 http://localhost/websocket/client.php访问您的网站。然后只要输入任何东西到该文本框,你会看到一个基本的 php 网络套接字的去!

你只需要记住。在网络套接字编程中,它只需要一个服务器和一个客户端。首先运行服务器代码,然后打开客户端代码。就是这样!希望这个能帮上忙!