SWOOLE结构与进程函数

继续上一篇文章,主要是说到 tcp 的问题及其解决方法,进程与线程的概念。问题解决方法主要是用到包头+包体的方式。

 

进程、线程、协程概念及关系

一个运行的程序是依赖于一个进程的,但是进程的资源消耗比较大,这个时候就需要线程来处理,一个进程可以有多个线程,但是线程有个缺点:运行状态需要切换

运行状态:初始化=》运行开始=》运行中=》阻塞=》销毁。

完成多个任务,我们可以开启多个进程,但是多个进程资源消耗大,这个时候我们就开启多个线程来完成,但是多线程状态需要切换,实际上多线程并不是真正的多个线程并行同时运行,而是以察觉不到的线程切换,来实现多线程的,这个时候就诞生了协程,协程依赖于线程,那多个协程就帮助多个线程完成多个任务,协程是可以利用线程的切换状态的阻塞时间去做一些事情的。

协程特点:切换速度最快的,资源消耗最小的。

协程和线程是共存的,线程的生命周期:从线程开启到线程关闭结束,协程和线程都是共存的,线程结束,协程也结束,协程利用下一个线程状态切换的时间去做其他的事。线程状态切换 对于程序来说是慢的,因为线程需要初始化=》变成运行状态=》销毁(这一过程是linux内核处理)。

协程:轻量级 ,切换快,协程运行的任务不能是阻塞的。整个过程就是充分利用电脑的资源。

<?php

// swoole的面向对象的写法
class Http{
    protected $http;
    protected $event = [
        'request',
    ];

    public function __construct($ip,$port)
    {
        //生成对象
        $this->http = new Swoole\Http\Server($ip,$port);
        echo $ip.":".$port."\n";
        $this->onEvent();
    }

    //注册事件方法
    public function onEvent()
    {
        foreach ($this->event as $v) {
            $this->http->on($v,[$this,$v]);
        }
    }

    //request事件
    public function request($request,$response)
    {
        var_dump($request->get, $request->post);
        $response->header("Content-Type", "text/html; charset=utf-8");
        $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
    }

    //开启服务
    public function start()
    {
        $this->http->start();
    }
}

$http = new Http('0.0.0.0',9501);

$http->start();
// swoole结构
ps -aux | grep 进程名
pstree -a | grep 进程名

master进程主要是监听swoole的核心事件,并驱动事件,同时又包含主线程和reactor线程组。

主线程:监听服务的socket套接字有没有连接进来,还会对线程组去做一个评估,做一个类似负载操作。

线程组(多个):主线程监听线程组来分发对应的请求。

负载均衡:很多个请求,通过nginx 分发到不同的服务器,来减轻服务器压力。

生活案例:客服电话。

主进程还做心跳检测,udp数据。

 

swoole运行流程

swoole_set_process_name() 修改进程名函数

评论