是否可以在客户端使用Sockets.io并与服务器上的基于PHP的应用程序通信? PHP甚至支持这种“长期连接”编写代码的方式吗?
我为socket.io找到的所有示例代码似乎都是服务器端的node.js,所以没有帮助。
答案 0 :(得分:96)
要回答这个问题可能有点晚了,但这就是我找到的。
我不想辩论节点是否比php更好,这不是重点。
解决方案是:我没有找到任何针对PHP的socket.io实现。
但是有一些方法可以实现WebSockets。有this jQuery plugin允许您使用Websockets,同时为不支持的浏览器优雅地降级。在PHP方面,this class似乎是PHP WS服务器中使用最广泛的。{/ p>
答案 1 :(得分:66)
如果您想将socket.io与php一起使用,这可能是您的答案!
项目网站:
他们也在github上:
https://github.com/wisembly/elephant.io
Elephant.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`';
套接字io服务器
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);
});
});
答案 2 :(得分:19)
更新:2014年8月当前的socket.io v1.0网站有一个PHP示例: - https://github.com/rase-/socket.io-php-emitter
答案 3 :(得分:13)
如果你真的想使用PHP作为socket.io的后端,这就是我找到的。 两个socket.io php服务器端替代。
https://github.com/walkor/phpsocket.io
https://github.com/RickySu/phpsocket.io
第一个存储库的Exmaple代码,如下所示。
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);
});
});
答案 4 :(得分:6)
以下是让您入门的内容: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非常适合做服务器端的东西,让它与现在在这个域中没有位置的连接一起使用。当你有websockets或flashsockets时,为什么要进行长轮询。
答案 5 :(得分:5)
对于你提到的“长期连接”,你可以使用Ratchet for PHP。它是一个基于Stream Socket函数构建的库,PHP从PHP 5开始就支持这些函数。
对于客户端,您需要使用HTML5支持的WebSocket而不是Socket.io(因为您知道,socket.io仅适用于node.js)。
如果您仍想使用Socket.io,可以尝试这种方式: - 发现&获取socket.io.js供客户端使用 - 使用Ratchet模拟socket.io在服务器上的方式
希望这有帮助!
答案 6 :(得分:4)
如果您真的想使用PHP作为WebSockets的后端,这些链接可以帮助您:
答案 7 :(得分:4)
我认识奋斗的人!但是我最近几乎与Workerman一起工作。 如果您还没有偶然发现过这个php框架,那么最好检查一下!
好吧,Workerman是一个异步事件驱动的PHP框架,用于轻松构建快速,可扩展的网络应用程序。 (我刚刚从他们的网站hahahah http://www.workerman.net/en/复制并粘贴了该内容)
解释这一点的简单方法是,当进行Web套接字编程时,您真正需要做的就是在服务器或本地服务器(无论您在哪里工作)中拥有2个文件。
server.php (将响应所有客户端请求的源代码)
client.php / client.html (将执行请求内容的源代码)
因此,基本上,您首先在 server.php 上对代码进行修改,然后启动服务器。通常,当我使用Windows时,会增加很多麻烦,因此我通过以下命令运行服务器-> php server.php start
好吧,如果您使用的是xampp。这是一种方法。转到要放置文件的位置。在我们的例子中,我们将把文件放入
C:/xampp/htdocs/websocket/server.php
C:/xampp/htdocs/websocket/client.php或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 或 client.html 源代码
<!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>
再次,打开命令行或git bash或将server.php文件放入其中的终端。因此,在我们的例子中,这是C:/ xampp / htdocs / websocket /并输入 php server.php start 并按Enter。
然后转到浏览器并输入 http://localhost/websocket/client.php 来访问您的网站。然后只要在该文本框中键入任何内容,您就可以在旅途中看到基本的php websocket!
您只需要记住。在Web套接字编程中,它只需要一个服务器和一个客户端。首先运行服务器代码,然后打开客户端代码。在那里,您拥有了!希望这会有所帮助!
答案 8 :(得分:3)
这个怎么样? PHPSocketio ??它是socket.io php服务器端的替代品。事件循环基于pecl事件扩展。虽然到现在为止还没有尝试过。
答案 9 :(得分:2)
我还没有尝试过,但您应该可以使用ReactPHP和此socket component执行此操作。看起来就像Node,但在PHP中。
答案 10 :(得分:2)
我们现在处于2018年,很高兴,有一种方法可以在php上实现WS和WAMPServer。称为Ratchet。
答案 11 :(得分:1)
我一直在寻找一种让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"));
这是一种有用的方式来信任&#34;您的客户从服务器获取合法消息。
您还可以让PHP传递数据库更新,而无需数百个客户端查询数据库。
我希望我能早点发现这一点 - 希望这有帮助!
答案 12 :(得分:0)
在这个库中查找php http://phptrends.com/category/70。 或者使用php http://www.php.net/manual/en/book.sockets.php中的native。