PHPSocket.IO,PHP跨平台实时通讯框架PHPSocket.IO是PHP版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服务端。PHPSocket.IO底层采用websocket协议通讯,如果客户端不支持websocket协议, 则会自动采用http长轮询的方式通讯。PHPSocket.IO实现的Polling通信机制包括Adobe Flash Socket、AJAX长轮询、JSONP轮询等。具体采用哪种机制通讯对于开发者完全透明, 开发者使用的是统一的接口。 PHPSocket.IO设计的目标是利用PHP构建能够在不同浏览器和移动设备上良好运行的实时应用,如实时分析系统、在线聊天室、在线客服系统、评论系统、WebIM等。 PHPSocket.IO与workerman的区别是,PHPSocket.IO基于workerman开发,workerman有的特性PHPSocket.IO都支持。 PHPSocket.IO最大的优势是对各种浏览器的兼容性更好。 源码地址
在线示例phpsocket.io手册安装请使用composer集成phpsocket.io。 composer require workerman/phpsocket.io 脚本中引用vendor中的autoload.php实现SocketIO相关类的加载。例如
服务端和客户端连接创建一个SocketIO服务端 <?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;
// 创建socket.io服务端,监听3120端口
$io = new SocketIO(3120);
// 当有客户端连接时打印一行文字
$io->on('connection', function($socket)use($io){
echo 'new connection coming\n';
});
Worker::runAll(); 客户端
自定义事件socket.io主要是通过事件来进行通讯交互的。 socket连接除了自带的connect,message,disconnect三个事件以外,在服务端和客户端开发者可以自定义其它事件。 服务端和客户端都通过emit方法触发对端的事件。 例如下面的代码在服务端定义了一个 <?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;
$io = new SocketIO(3120);
// 当有客户端连接时
$io->on('connection', function($socket)use($io){
// 定义chat message事件回调函数
$socket->on('chat message', function($msg)use($io){
// 触发所有客户端定义的chat message from server事件
$io->emit('chat message from server', $msg);
});
});
Worker::runAll(); 客户端通过下面的方法触发服务端的chat message事件。
workerStart事件phpsocket.io提供了workerStart事件回调,也就是当进程启动后准备好接受客户端链接时触发的回调。 require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;
$io = new SocketIO(9120);
// 监听一个http端口,通过http协议访问这个端口可以向所有客户端推送数据(url类似http://ip:9191?msg=xxxx)
$io->on('workerStart', function()use($io) {
$inner_http_worker = new Worker('http://0.0.0.0:9191');
$inner_http_worker->onMessage = function($http_connection, $data)use($io){
if(!isset($_GET['msg'])) {
return $http_connection->send('fail, $_GET['msg'] not found');
}
$io->emit('chat message', $_GET['msg']);
$http_connection->send('ok');
};
$inner_http_worker->listen();
});
// 当有客户端连接时
$io->on('connection', function($socket)use($io){
// 定义chat message事件回调函数
$socket->on('chat message', function($msg)use($io){
// 触发所有客户端定义的chat message from server事件
$io->emit('chat message from server', $msg);
});
});
Worker::runAll(); phpsocket.io启动后开内部http端口通过phpsocket.io向客户端推送数据参考 web-msg-sender。 分组socket.io提供分组功能,允许向某个分组发送事件,例如向某个房间广播数据。 1、加入分组(一个连接可以加入多个分组)
2、离开分组(连接断开时会自动从分组中离开) $socket->leave('group name'); 向客户端发送事件的各种方法$io是SocketIO对象。$socket是客户端连接 $data可以是数字和字符串,也可以是数组。当$data是数组时,客户端会自动转换为javascript对象。 同理如果客户端向服务端emit某个事件传递的是一个javascript对象,在服务端接收时会自动转换为php数组。 1、向当前客户端发送事件
2、向所有客户端发送事件 $io->emit('event name', $data); 3、向所有客户端发送事件,但不包括当前连接。
4、向某个分组的所有客户端发送事件 $io->to('group name')->emit('event name', $data); 获取客户端ip
关闭链接$socket->disconnect(); 限制连接域名当我们想指定特定域名的页面才能连接,可以用$io->origins方法来设置域名白名单。
多个域名时用空格分隔,类似 $io = new SocketIO(2020);
$io->origins('http:// http://www.'); 心跳自带心跳,无需手动设置 支持SSL(https wss)SSL支持有两种方法,workerman原生和nginx代理 workerman原生支持SSL 要求workerman>=3.3.7 phpsocket.io>=1.1.1
注意: <script>
var socket = io('https://:2120');
//.....
</script> nginx代理SSL前提条件及准备工作: 1、已经安装nginx,版本不低于1.3 2、假设phpsocket.io监听的是2120端口 3、已经申请了证书(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下 4、打算利用nginx开启443端口对外提供ssl代理服务(端口可以根据需要修改) nginx配置类似如下:
注意:
<script>
var socket = io('https://');
//.....
</scrip |
|