phpsocket.io的使用方法

来源:赵克立博客 分类: PHP 标签:socket发布时间:2018-07-02 14:48:16最后更新:2019-05-03 16:17:35浏览:5779
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2019-05-03 16:17:35
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

使用php做一个socket服务器来推送消息

环境配置

win10

apache

php5.6


环境搭建

找一个空的目录先用composer安装 phpsocket.io-for-win(windows下使用这个linux下直接使用phpsocket.io)如下,先初始化composer

composer init

然后安装workerman/phpsocket.io-for-win

composer require workerman/phpsocket.io-for-win

安装完成后就可以开始写代码测试啦


官方示例

https://github.com/walkor/phpsocket.io/tree/master/examples/chat

因为在windows下上面示例不能直接启动,需要改成两个命令窗口来运行才行,一个web服务一个socket服务不然会出现下面的提示

image.png

出现这个提示的时候上面的webserver是启动成功啦但是phpsocketio却没有成功,虽然显示的是ok。

我的示例

自己搭建web服务器,然后使用phpsocket.io服务来实现功能,代码是我在官方代码的基础上改动过的,https://github.com/zhaokeli/phpsocket 使用方法,使用git下载后

1、composer install

2、创建一个站点,站点根目录为这个目录

3、运行start-debug.bat

4、地址栏输入你访问站点的路径就可以看效果啦


消息推送


使用http实现调用api进行消息主动推送

// 当$io启动后监听一个http端口,通过这个端口可以给任意uid或者所有uid推送数据
$io->on('workerStart', function(){
    // 监听一个http端口
    $inner_http_worker = new Worker('http://0.0.0.0:2121');
    // 当http客户端发来数据时触发
    $inner_http_worker->onMessage = function($http_connection, $data){
        global $uidConnectionMap;
        $_POST = $_POST ? $_POST : $_GET;
        // 推送数据的url格式 type=publish&to=uid&content=xxxx
        switch(@$_POST['type']){
            case 'publish':
                global $io;
                $to = @$_POST['to'];
                $_POST['content'] = htmlspecialchars(@$_POST['content']);
                // 有指定uid则向uid所在socket组发送数据
                if($to){
                    $io->to($to)->emit('new_msg', $_POST['content']);
                // 否则向所有uid推送数据
                }else{
                    $io->emit('new_msg', @$_POST['content']);
                }
                // http接口返回,如果用户离线socket返回fail
                if($to && !isset($uidConnectionMap[$to])){
                    return $http_connection->send('offline');
                }else{
                    return $http_connection->send('ok');
                }
        }
        return $http_connection->send('fail');
    };
    // 执行监听
    $inner_http_worker->listen();
    // 一个定时器,定时向所有uid推送当前uid在线数及在线页面数
    Timer::add(1, function(){
        global $uidConnectionMap, $io, $last_online_count, $last_online_page_count;
        $online_count_now = count($uidConnectionMap);
        $online_page_count_now = array_sum($uidConnectionMap);
        // 只有在客户端在线数变化了才广播,减少不必要的客户端通讯
        if($last_online_count != $online_count_now || $last_online_page_count != $online_page_count_now)
        {
            $io->emit('update_online_count', "当前<b>{$online_count_now}</b>人在线,共打开<b>{$online_page_count_now}</b>个页面");
            $last_online_count = $online_count_now;
            $last_online_page_count = $online_page_count_now;
        }
    });
});


使用方法参考 https://www.workerman.net/web-sender

常用的方法api

分组

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();



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python