工具地址:https://github.com/walkor/phpsocket.io

phpsocket.io是由workerman根据socket.IO扩展的用于php服务端通讯组件,后台服务用workerman监听端口,处理事件回调.
socket.io-client客户端 socket.io.js 供前端界面初始化io
下面是phpsocket.io操作手册:

安装

请使用composer集成phpsocket.io。

脚本中引用vendor中的autoload.php实现SocketIO相关类的加载。例如

require_once '/你的vendor路径/autoload.php';

服务端和客户端连接

创建一个SocketIO服务端

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

// 创建socket.io服务端,监听2021端口
$io = new SocketIO(3120);
// 当有客户端连接时打印一行文字
$io->on('connection', function($socket)use($io){  echo "new connection coming\n";
});

Worker::runAll();

客户端

<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script>
// 如果服务端不在本机,请把127.0.0.1改成服务端ip
var socket = io('http://127.0.0.1:3120');
// 当连接服务端成功时触发connect默认事件
socket.on('connect', function(){console.log('connect success');
});
</script>

自定义事件

socket.io主要是通过事件来进行通讯交互的。

socket连接除了自带的connect,message,disconnect三个事件以外,在服务端和客户端开发者可以自定义其它事件。

服务端和客户端都通过emit方法触发对端的事件。

例如下面的代码在服务端定义了一个chat message事件,事件参数为$msg

<?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事件。

<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 连接服务端
var socket = io('http://127.0.0.1:3120');
// 触发服务端的chat message事件
socket.emit('chat message', '这个是消息内容...');
// 服务端通过emit('chat message from server', $msg)触发客户端的chat message from server事件
socket.on('chat message from server', function(msg){console.log('get message:' + msg + ' from server');
});
</script>

workerStart事件

phpsocket.io提供了workerStart事件回调,也就是当进程启动后准备好接受客户端链接时触发的回调。 一个进程生命周期只会触发一次。可以在这里设置一些全局的事情,比如开一个新的Worker端口等等。

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、加入分组(一个连接可以加入多个分组)

$socket->join('group name');

2、离开分组(连接断开时会自动从分组中离开)

$socket->leave('group name');

向客户端发送事件的各种方法

$io是SocketIO对象。$socket是客户端连接

$data可以是数字和字符串,也可以是数组。当$data是数组时,客户端会自动转换为javascript对象。

同理如果客户端向服务端emit某个事件传递的是一个javascript对象,在服务端接收时会自动转换为php数组。

1、向当前客户端发送事件

$socket->emit('event name', $data);

2、向所有客户端发送事件

$io->emit('event name', $data);

3、向所有客户端发送事件,但不包括当前连接。

$socket->broadcast->emit('event name', $data);

4、向某个分组的所有客户端发送事件

$io->to('group name')->emit('event name', $data);

获取客户端ip

$io->on('connection', function($socket)use($io){        var_dump($socket->conn->remoteAddress);
});

关闭链接

$socket->disconnect();

支持SSL(https wss)

SSL 要求workerman>=3.3.7 phpsocket.io>=1.1.1

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

// 传入ssl选项,包含证书的路径
$context = array(
    'ssl' => array(
        'local_cert'  => '/your/path/of/server.pem',
        'local_pk'    => '/your/path/of/server.key',
        'verify_peer' => false,
    )
);
$io = new SocketIO(2021, $context);

$io->on('connection', function($socket)use($io){  echo "new connection coming\n";
});

Worker::runAll();

注意:
1、证书是要验证域名的,所以客户端链接时要指定域名才能顺利的建立链接。
2、客户端连接时不能再用http方式,要改成https类似下面这样。

<script>
var socket = io('https://yoursite.com:3120');
//.....
</script>

aa

前端测试:

<script src='http://cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>// 连接服务端,workerman.net:2120换成实际部署web-msg-sender服务的域名或者ipvar socket = io('http://workerman.net:2120');// uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数uid = 123;// socket连接后以uid登录socket.on('connect', function(){socket.emit('login', uid);});// 后端推送来消息时socket.on('new_msg', function(msg){console.log("收到消息:"+msg);});// 后端推送来在线数据时socket.on('update_online_count', function(online_stat){console.log(online_stat);});
</script>

后端调用api向任意用户推送:

<?php
// 指明给谁推送,为空表示向所有在线用户推送
$to_uid = "";
// 推送的url地址,使用自己的服务器地址
$push_api_url = "http://workerman.net:2121/";
$post_data = array("type" => "publish","content" => "这个是推送的测试数据","to" => $to_uid,
);
$ch = curl_init (); //curl初始化
curl_setopt ( $ch, CURLOPT_URL, $push_api_url ); //api地址
curl_setopt ( $ch, CURLOPT_POST, 1 ); //设置为POST方式
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); //头信息不输出
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );  //如果成功只将结果返回,不自动输出任何内容
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );  //POST数据
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:")); //当post数据大于1024时强制执行
$return = curl_exec ( $ch ); //执行
curl_close ( $ch ); //关闭资源
var_export($return);  //打印结果同var_dump()

基于socket.io的php扩展介绍---phpsocket.io相关推荐

  1. 在线白板,基于socket.io的多人在线协作工具

    为什么80%的码农都做不了架构师?>>>    首发:个人博客,更新&纠错&回复 是昨天这篇博文留的尾巴,socket.io库的使用练习,成品地址在这里. 代码已经上 ...

  2. php socket laravel,Laravel整合PHPSocket.Io实现web消息推送

    PHPSocket.IO ,PHP跨平台实时通讯框架 PHPSocket.IO是 PHP 版本的Socket.IO服务端实现,基于workerman开发,用于替换node.js版本Socket.IO服 ...

  3. 基于socket.io的web聊天室

    基于socket.io的web聊天室 一. 项目介绍 该项目使用node.js作为后端服务器框架,并利用socket.io来实现web聊天室功能.socket.io是由 JavaScript 实现的基 ...

  4. 基于socket.io的实时在线选座系统

    基于socket.io的实时在线选座系统(demo) 前言 前段时间公司做一个关于剧院的项目,遇到了这样一种情况. 在高并发多用户同时选座的情况下,假设A用户进入选座页面,正在选择座位,此时还没有提交 ...

  5. ios视频通话三方_iOS基于Socket.io即时通讯IM实现,WebRTC实现视频通话

    Socket.io-FLSocketIM-iOS 基于Socket.io iOS即时通讯客户端 iOS IM Client based on Socket.io 实现功能 文本发送 图片发送(从相册选 ...

  6. 2021年大数据Flink(四十六):扩展阅读 异步IO

    目录 扩展阅读  异步IO 介绍 异步IO操作的需求 使用Aysnc I/O的前提条件 Async I/O API 案例演示 扩展阅读 原理深入 AsyncDataStream 消息的顺序性 扩展阅读 ...

  7. php 基于socket的基本通信

    php 基于socket的基本通信 1.前言 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐 ...

  8. Flex与.NET互操作(一):基于Socket的网络连接

    Flash/Flex也支持基于Socket的网络连接 ,服务器端可以是C++,VB,C#,Java等任一语言开发.监听一个网络端口便可以接收到Flash/Flex开发的客户端的连接. ActionSc ...

  9. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

最新文章

  1. 摩尔定律行将就木?AI灵丹助其返老还童!(附论文)
  2. 机器学习常用激活函数
  3. python开多少进程合适_python多进程基础
  4. MxGraph从入门到精通之1:运行HelloWorld示例程序
  5. 首页优化加载(聊聊百度移动端首页前端优化)
  6. javascript 的默认对象
  7. linux学习之lvm-逻辑卷管理器
  8. Android开发笔记(一百七十九)避免方法数过多的问题
  9. mysql配置utf8_mb4
  10. 双子星tv源码_双子星IPTV电视直播管理系统源码安装教程
  11. KETTLE使用教程(包含几个小示例)
  12. 3D贴图绘制软件Substance 3D Painter 2022中文版
  13. AEJoy —— 表达式之弹性(韧性)模拟详解【JS】
  14. css3中文参考手册
  15. 应届生面试自我介绍该怎么说?
  16. 自学白帽黑客的第一年总结
  17. Unity HDRP中解决抗锯齿问题
  18. C++接口实现汉字拼音转换
  19. 网络安全学习(渗透测试方法论,web架构安全分析,信息收集)
  20. Bot console WeChat机器人

热门文章

  1. 倾听:不只是听见(倾听有哪些挑战?如何利用倾听技巧更好的理解他人)
  2. 数字化波形声音的wav文件浅析
  3. 谷歌地图-Google Map
  4. 解决Ubuntu16.04耳机没声音问题
  5. 钰泰ETA2821,42V/1.5A降压转换器,集成OVP功能防浪涌
  6. 深入理解模型视图、自定义模型
  7. 【PHP】php 递归、效率和分析
  8. JAVA 的性能优化
  9. sin和cos的爱恋
  10. SQL中各关键字以及DBeaver工具的使用