Swoole基础教程

Swoole - PHP 协程框架

哔哩哔哩:https://www.bilibili.com/video/BV1uwfGYTE2P/

1、了解什么是swoole


– 开发环境搭建 –

1、安装虚拟机


virtualbox(v5.1.38) 开启虚拟化

2、安装linux系统


CentOs下载

Linux系统配置

  • ifconfig (常用)
  • ip addr
  • vi /etc/sysconfig/network-scripts/ifcfg-xx点击i 变成输入状态 把no 改成yes 按esc 然后(冒号) :wq
  • service network restart
  • yum install net-tools 可以使用ifconfig
  • 切换桥接网卡
  • 使用Xshell连接Linux系统Xshell下载地址:https://xshell.en.softonic.com/
  • 替换默认源

http://mirrors.163.com/.help/centos.html

  • 使用xshell连接
    • 1、安装能够下载的命令:yum install wget
    • 2、进行备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    • 3、进入文件夹cd /etc/yum.repos.d/
    • 4、复制centos7的下载地址
    • 5、使用wget下载wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
    • 6、复制这两个命令执行yum clean all yum makecache
  • 安装vimyum install vim

3、安装宝塔面板


宝塔官网:https://www.bt.cn/

配置宝塔面板:

  • 安装php

4、安装thinkphp框架


  • 安装composer
  • 安装thinkphp
  • 运行thinkphp

5、安装swoole扩展


6、启动swoole


  • 配置think-swoole
  • 启动swoole
  • 守护进程
  • 配置websocket

7、远程编辑代码


  • 安装phpstorm插件:swoole IDE helperfile—-settings—-plugins—–marketplace—–swoole
  • 远程连接服务器tools—-deployment——configuration——-添加
  • 设置自动上传开启自动上传:automatic upload

8、代码热更新


  • swoole.php 修改 hot_update 为true
  • 默认是只有app目录生效

– Swoole基础 –

1、websocket事件


  • 事件监听
'listen'  =>    [
        //连接事件监听
        'swoole.websocket.Connect'    =>    [
            'app\listener\WsConnect'
        ],
    
        //关闭事件监听
        'swoole.websocket.Close'    =>    [
            'app\listener\WsClose'
        ],
    
        // 自定义事件监听
        'swoole.websocket.Test'    =>    [
            'app\listener\WsTest'
        ],
    ],
  • 第二种设置方式(任选一种)
swoole.php
​
'connect' => 'app\listener\WsConnect',
'close' => 'app\listener\WsClose',
'test' => 'app\listener\WsTest',

2、websocket客户端


<script>
    var ws = new WebSocket("ws://192.168.31.184:8080");
​
    ws.onopen = function (){
        console.log("连接成功")
    }
    
    ws.onclose = function () {
        console.log("连接失败")
    }
​
    ws.onmessage = function (evt) {
        console.log(evt)
    }
</script>

3、websocket客户端连接服务器


4、think-swoole连接事件


<?php
declare (strict_types = 1);

namespace app\listener;

class WsConnect
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,\think\swoole\Websocket $ws)
    {
        echo '已经连接!';
//        var_dump($event);
//        var_dump($ws->getSender());
//        var_dump(get_class($ws));
//        var_dump(get_class_methods($ws));
    }
}

5、websoket客户端连接事件


Socket.onmessage = function (evt) { 

             console.log(evt.data);

};

6、服务端和客户端的关闭事件


<?php
declare (strict_types = 1);

namespace app\listener;

class WsClose
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,\think\swoole\Websocket $ws)
    {
//        echo "已经断开了";
//        var_dump($ws->getSender());
    }
}
Socket.onclose = function() {

	console.log("已经断开连接")

}

7、think-swoole自定义事件


<?php
declare (strict_types = 1);

namespace app\listener;

class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //
    }
}

8、客户端给服务端发送消息


ws.send(JSON.stringify(['事件名',data)])
class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //
        echo "我接收到了一条数据";
        var_dump($event);
    }
}

9、服务端给客户端发送消息


<?php
declare (strict_types = 1);

namespace app\listener;

class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,\think\swoole\Websocket $ws)
    {

        echo "我接收到了一条数据";
        var_dump($event);
        //获取发送消息的fd
        $fd = $ws->getSender();
        //发送消息给fd的客户端
        $ws->to($fd)->emit('test_callback','你也好啊');

    }
}

10、客户端给其他客户端发送消息


<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>websocket</title>
</head>
<body>
	<h1>websocket功能</h1>

	消息:<input id='msg' type="text"><br>
	发送给:<input id='fd' type="text"><br>

	<button onclick="send()">发送</button>


	<script>
		
		var Socket = new WebSocket('ws://192.168.31.237:8080');

		Socket.onopen = function(){

			console.log("已经连接上了")

		}

		Socket.onclose = function() {

			console.log("已经断开连接")

		}

		Socket.onmessage = function (evt) { 

             console.log(evt.data);

        };

        // function send(){

        // 	// console.log('运行到这里了')
        // 	var msg = document.getElementById("msg").value

        // 	Socket.send(JSON.stringify(['Test',msg]));
        // }

        function send() {
        	var msg = document.getElementById("msg").value;
        	var fd = document.getElementById("fd").value;

        	Socket.send(JSON.stringify(['Test',{
        		'msg': msg,
        		'fd': fd
        	}]));
       	}
       


	</script>
</body>
</html>
<?php
declare (strict_types = 1);

namespace app\listener;

class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,\think\swoole\Websocket $ws)
    {
        echo "我接收到了一条数据";
        //var_dump($event['msg']);
        //var_dump($event['fd']);
        $ws->to($event['fd'])->emit('test_callback',$event['msg']);
    }
}

11、服务端发送广播消息


<?php
declare (strict_types = 1);

namespace app\listener;

class WsTest
{
    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event,\think\swoole\Websocket $ws)
    {
        echo "我接收到了一条数据";

        //发送广播消息
	
        $ws->broadcast()->emit('test_callback','这是一条广播消息');
        
        $ws->emit('test_callback','这是一条广播消息');
        
    }
}

12、客户端解析websoket消息


function mycallback(data) {
        
        var start = data.indexOf('[')  // [ 第一次出现的位置  1
        var start1 = data.indexOf('{') // 1

        if (start < 0) {
            start = start1;
        }
        if  (start >=0 && start1 >=0) {
            start = Math.min(start, start1);
        }

        if (start >= 0) {
            console.log(data)
            var json = data.substr(start);// 截取
            var json = JSON.parse(json);
            console.log(json)
            if (json instanceof  Array) {
                window[json[0]](json[1]);
            }

        }
    }

13、客户端加入房间功能概述


14、客户端加入房间事件


$ws->join('RoomOne');

$ws->setSender(fd)->join(rooms);

15、客户端离开房间事件


$ws->leave('RoomOne');

16、给房间内成员发送消息


$ws->to("roomName")->emit('事件名',msg)

$ws->to(['roomName1','roomName2'....])->emit('事件名',msg)

17、事件订阅


  1. 删除event.php中的监听
  2. swoole.php中的websocket内设置subscribe'subscribe' => [ \app\listener\Subscribe::class ],
  3. 创建监听类:php think make Subscribe
    protected $ws = null;
​
    public function __construct()
    {
        $this->ws = app('think\swoole\Websocket');
    }
​
    public function onConnect()
    {
        echo '事件订阅类中的连接成功';
        var_dump($this->ws->getSender());
    }
​
    public function onClose()
    {
        echo '关闭连接';
        var_dump($this->ws->getSender());
    }
​
    public function onTest($event)
    {
        echo 'test事件监听,收到消息';
        var_dump($event);
    }
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧