前言
进程、线程、协程概念及关系
swoole的面向对象的写法
swoole结构
swoole运行流程
网络io模型
上节课,主要是说到tcp的问题及其解决方法,进程与线程的概念。问题解决方法主要是用到包头+包体的方式。
一个运行的程序是依赖于一个进程的,但是进程的资源消耗比较大,这个时候就需要线程来处理,一个进程可以有多个线程,但是线程有个缺点:运行状态需要切换。运行状态:初始化=》运行开始=》运行中=》阻塞=》销毁。完成多个任务,我们可以开启多个进程,但是多个进程资源消耗大,这个时候我们就开启多个线程来完成,但是多线程状态需要切换,实际上多线程并不是真正的多个线程并行同时运行,而是以察觉不到的线程切换,来实现多线程的,这个时候就诞生了协程,协程依赖于线程,那多个协程就帮助多个线程完成多个任务。协程是可以利用线程的切换状态的阻塞时间去做一些事情的。协程特点:切换速度最快的,资源消耗最小的。协程和线程是共存的,线程的生命周期:从线程开启到线程关闭结束,协程和线程都是共存的,线程结束,协程也结束,协程利用下一个线程状态切换的时间去做其他的事。线程状态切换 对于程序来说是慢的,因为线程需要初始化=》变成运行状态=》销毁(这一过程是linux内核处理)。协程:轻量级 ,切换快,协程运行的任务不能是阻塞的。整个过程就是充分利用电脑的资源。
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("Hello Swoole. #".rand(1000, 9999)."
");
}
//开启服务
public function start()
{
$this->http->start();
}
}
$http = new Http('0.0.0.0',9501);
$http->start();
ps -aux | grep 进程名
pstree -a | grep 进程名
master进程主要是监听swoole的核心事件,并驱动事件,同时又包含主线程和reactor线程组。主线程:监听服务的socket套接字有没有连接进来,还会对线程组去做一个评估,做一个类似负载操作。线程组(多个):主线程监听线程组来分发对应的请求。
负载均衡:很多个请求,通过nginx 分发到不同的服务器,来减轻服务器压力。
生活案例:客服电话。
主进程还做心跳检测,udp数据。
swoole_set_process_name() 修改进程名函数