目录
进程
线程
解释
swoole进程
client跟server的交互:
Master进程内的回调函数
Manager进程内的回调函数
Worker进程内的回调函数
Task进程内的回调函数
简单说明:
swoole运行流程图
首页 php框架 Swoole 你对swoole的进程,线程知道多少

你对swoole的进程,线程知道多少

Nov 24, 2020 pm 04:47 PM
swoole 线程 进程

swoole教程栏目介绍swoole的进程,线程。

你对swoole的进程,线程知道多少

推荐(免费):swoole教程
进程

1、进程之间不共享任何状态
2、进程的调度由操作系统完成
3、每个进程都有自己独立的内存空间
4、进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低
5、由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦。

线程

1、线程之间共享变量,解决了通讯麻烦的问题对于变量的访问需要锁
2、一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。
3、另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上下文的切换也变得高效。

解释
  • 通过php,运行一个php文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间系统资源并且运行相应的程序。
    在这里插入图片描述
swoole进程

在这里插入图片描述
1、Master进程:主进程
2、Manger进程:管理进程
3、Worker进程:工作进程
4、Task进程:异步任务工作进程

  • 第一层,Master进程,这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的,那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程],swoole所有对于事件的监听都会在这些线程中实现,比如来自客户端的连接,信号处理等。

  • 1.1、MainReactor(主线程)
    主线程会负责监听server socket,如果有新的连接accept,主线程会评估每个Reactor线程的连接数量。将此连接分配给连接数最少的reactor线程,做一个负载均衡。

  • 1.2 、Reactor线程组
    Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式。
    swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。

  • 1.3、心跳包检测线程(HeartbeatCheck)
    Swoole配置了心跳检测之后,心跳包线程会在固定时间内对所有之前在线的连接
    发送检测数据包

  • 1.4、UDP收包线程(UdpRecv)
    接收并且处理客户端udp数据包

  • swoole想要实现最好的性能必须创建出多个工作进程帮助处理任务,但Worker进程就必须fork操作,但是fork操作是不安全的,如果没有管理会出现很多的僵尸进程,进而影响服务器性能,同时worker进程被误杀或者由于程序的原因会异常退出,为了保证服务的稳定性,需要重新创建worker进程。

  • Swoole在运行中会创建一个单独的管理进程,所有的worker进程和task进程都是从管理进程Fork出来的。管理进程会监视所有子进程的退出事件,当worker进程发生致命错误或者运行生命周期结束时,管理进程会回收此进程,并创建新的进程。换句话也就是说,对于worker、task进程的创建、回收等操作全权有“保姆”Manager进程进行管理

  • worker 进程属于swoole的主逻辑进程,用户处理客户端的一系列请求,接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端可以是异步非阻塞模式,也可以是同步阻塞模式

  • taskWorker进程这一进城是swoole提供的异步工作进程,这些进程主要用于处理一些耗时较长的同步任务,在worker进程当中投递过来。

client跟server的交互:

1、client请求到达 Main Reactor,Client实际上是与Master进程中的某个Reactor线程发生了连接。

2、Main Reactor根据Reactor的情况,将请求注册给对应的Reactor (每个Reactor都有epoll。用来监听客户端的变化)

3、客户端有变化时Reactor将数据交给worker来处理

4、worker处理完毕,通过进程间通信(比如管道、共享内存、消息队列)发给对应的reactor。

5、reactor将响应结果发给相应的连接请求处理完成

Master进程内的回调函数
  • onStart Server启动在主进程的主线程回调此函数
  • onShutdown 此事件在Server正常结束时发生
Manager进程内的回调函数
  • onManagerStart 当管理进程启动时调用它
  • onManagerStop 当管理进程结束时调用它
  • onWorkerError 当worker/task_worker进程发生异常后会在Manager进程内回调此函数
Worker进程内的回调函数
  • onWorkerStart 此事件在Worker进程/Task进程启动时发生
  • onWorkerStop 此事件在worker进程终止时发生。
  • onConnect 有新的连接进入时,在worker进程中回调
  • onClose TCP客户端连接关闭后,在worker进程中回调此函数
  • onReceive 接收到数据时回调此函数,发生在worker进程中
  • onPacket 接收到UDP数据包时回调此函数,发生在worker进程中
  • onFinish 当worker进程投递的任务在task_worker中完成时,task进程会通过finish()方法将任务处理的结果发送给worker进程。
  • onWorkerExit 仅在开启reload_async特性后有效。异步重启特性
  • onPipeMessage 当工作进程收到由 sendMessage 发送的管道消息时会触发事件
Task进程内的回调函数
  • onTask 在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务
  • onWorkerStart 此事件在Worker进程/Task进程启动时发生
  • onPipeMessage 当工作进程收到由 sendMessage 发送的管道消息时会触发事件
简单说明:
  • 1、服务器关闭程序终止时最后一次事件是onShutdown。
  • 2、服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执行,并不是顺序的。
  • 3、所有事件回调均在$server->start后发生,start之后写的代码是无效代码。
  • 4、onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的
swoole运行流程图

在这里插入图片描述

<?php//tcp协议$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象$server->set([
    'worker_num'=>3, //设置进程
    //'heartbeat_idle_time'=>10,//连接最大的空闲时间
    //'heartbeat_check_interval'=>3 //服务器定时检查
    'open_length_check'=>1,
    'package_length_type'=>'N',//设置包头的长度
    'package_length_offset'=>0, //包长度从哪里开始计算
    'package_body_offset'=>4,  //包体从第几个字节开始计算
    'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){

    var_dump(1);
     //设置主进程的名称
     swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$server->on('ManagerStart',function (){
    var_dump(2);
    //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){
   // swoole_set_process_name("server-process:worker");
    var_dump(3);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    //var_dump("消息发送过来:".$data);
    //服务端});//消息关闭$server->on('close',function (){
    echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
登录后复制
登录后复制
进程

1、进程之间不共享任何状态
2、进程的调度由操作系统完成
3、每个进程都有自己独立的内存空间
4、进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低
5、由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦。

线程

1、线程之间共享变量,解决了通讯麻烦的问题对于变量的访问需要锁
2、一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。
3、另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上下文的切换也变得高效。

解释
  • 通过php,运行一个php文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间系统资源并且运行相应的程序。
    在这里插入图片描述
swoole进程

在这里插入图片描述
1、Master进程:主进程
2、Manger进程:管理进程
3、Worker进程:工作进程
4、Task进程:异步任务工作进程

  • 第一层,Master进程,这个是swoole的主进程,这个进程是用于处理swoole的核心事件驱动的,那么在这个进程当中可以看到它拥有一个MainReactor[线程]以及若干个Reactor[线程],swoole所有对于事件的监听都会在这些线程中实现,比如来自客户端的连接,信号处理等。

  • 1.1、MainReactor(主线程)
    主线程会负责监听server socket,如果有新的连接accept,主线程会评估每个Reactor线程的连接数量。将此连接分配给连接数最少的reactor线程,做一个负载均衡。

  • 1.2 、Reactor线程组
    Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据完全是异步非阻塞的模式。
    swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。

  • 1.3、心跳包检测线程(HeartbeatCheck)
    Swoole配置了心跳检测之后,心跳包线程会在固定时间内对所有之前在线的连接
    发送检测数据包

  • 1.4、UDP收包线程(UdpRecv)
    接收并且处理客户端udp数据包

  • swoole想要实现最好的性能必须创建出多个工作进程帮助处理任务,但Worker进程就必须fork操作,但是fork操作是不安全的,如果没有管理会出现很多的僵尸进程,进而影响服务器性能,同时worker进程被误杀或者由于程序的原因会异常退出,为了保证服务的稳定性,需要重新创建worker进程。

  • Swoole在运行中会创建一个单独的管理进程,所有的worker进程和task进程都是从管理进程Fork出来的。管理进程会监视所有子进程的退出事件,当worker进程发生致命错误或者运行生命周期结束时,管理进程会回收此进程,并创建新的进程。换句话也就是说,对于worker、task进程的创建、回收等操作全权有“保姆”Manager进程进行管理

  • worker 进程属于swoole的主逻辑进程,用户处理客户端的一系列请求,接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端可以是异步非阻塞模式,也可以是同步阻塞模式

  • taskWorker进程这一进城是swoole提供的异步工作进程,这些进程主要用于处理一些耗时较长的同步任务,在worker进程当中投递过来。

client跟server的交互:

1、client请求到达 Main Reactor,Client实际上是与Master进程中的某个Reactor线程发生了连接。

2、Main Reactor根据Reactor的情况,将请求注册给对应的Reactor (每个Reactor都有epoll。用来监听客户端的变化)

3、客户端有变化时Reactor将数据交给worker来处理

4、worker处理完毕,通过进程间通信(比如管道、共享内存、消息队列)发给对应的reactor。

5、reactor将响应结果发给相应的连接请求处理完成

Master进程内的回调函数
  • onStart Server启动在主进程的主线程回调此函数
  • onShutdown 此事件在Server正常结束时发生
Manager进程内的回调函数
  • onManagerStart 当管理进程启动时调用它
  • onManagerStop 当管理进程结束时调用它
  • onWorkerError 当worker/task_worker进程发生异常后会在Manager进程内回调此函数
Worker进程内的回调函数
  • onWorkerStart 此事件在Worker进程/Task进程启动时发生
  • onWorkerStop 此事件在worker进程终止时发生。
  • onConnect 有新的连接进入时,在worker进程中回调
  • onClose TCP客户端连接关闭后,在worker进程中回调此函数
  • onReceive 接收到数据时回调此函数,发生在worker进程中
  • onPacket 接收到UDP数据包时回调此函数,发生在worker进程中
  • onFinish 当worker进程投递的任务在task_worker中完成时,task进程会通过finish()方法将任务处理的结果发送给worker进程。
  • onWorkerExit 仅在开启reload_async特性后有效。异步重启特性
  • onPipeMessage 当工作进程收到由 sendMessage 发送的管道消息时会触发事件
Task进程内的回调函数
  • onTask 在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务
  • onWorkerStart 此事件在Worker进程/Task进程启动时发生
  • onPipeMessage 当工作进程收到由 sendMessage 发送的管道消息时会触发事件
简单说明:
  • 1、服务器关闭程序终止时最后一次事件是onShutdown。
  • 2、服务器启动成功后,onStart/onManagerStart/onWorkerStart会在不同的进程内并发执行,并不是顺序的。
  • 3、所有事件回调均在$server->start后发生,start之后写的代码是无效代码。
  • 4、onStart/onManagerStart/onWorkerStart 3个事件的执行顺序是不确定的
swoole运行流程图

在这里插入图片描述

<?php//tcp协议$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象$server->set([
    'worker_num'=>3, //设置进程
    //'heartbeat_idle_time'=>10,//连接最大的空闲时间
    //'heartbeat_check_interval'=>3 //服务器定时检查
    'open_length_check'=>1,
    'package_length_type'=>'N',//设置包头的长度
    'package_length_offset'=>0, //包长度从哪里开始计算
    'package_body_offset'=>4,  //包体从第几个字节开始计算
    'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){

    var_dump(1);
     //设置主进程的名称
     swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$server->on('ManagerStart',function (){
    var_dump(2);
    //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){
   // swoole_set_process_name("server-process:worker");
    var_dump(3);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    //var_dump("消息发送过来:".$data);
    //服务端});//消息关闭$server->on('close',function (){
    echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
登录后复制
登录后复制

以上是你对swoole的进程,线程知道多少的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

解释一下explorer.exe进程是什么 解释一下explorer.exe进程是什么 Feb 18, 2024 pm 12:11 PM

explorer.exe是什么进程在我们使用Windows操作系统的时候,经常会听到一个名词"explorer.exe".那么,你是否好奇这个进程到底是什么?在本文中,我们将详细解释explorer.exe是什么进程以及其功能和作用。首先,explorer.exe是Windows操作系统的一个关键进程,它负责管理和控制Windows资源管理器(Window

请问ccsvchst.exe是哪种进程? 请问ccsvchst.exe是哪种进程? Feb 19, 2024 pm 11:33 PM

ccsvchst.exe是一种常见的进程文件,它是SymantecEndpointProtection(SEP)软件的一部分,而SEP则是一款由著名的网络安全公司Symantec开发的终端保护解决方案。作为该软件的一部分,ccsvchst.exe负责管理和监控SEP的相关进程。首先,我们来了解一下SymantecEndpointProtection(

如何正确杀死Linux中的僵尸进程 如何正确杀死Linux中的僵尸进程 Feb 19, 2024 am 10:40 AM

在Linux系统中,僵尸进程是已经终止但仍保留在系统中的特殊进程。虽然僵尸进程不会消耗太多资源,但如果数量过多,可能会导致系统资源耗尽。本文将介绍如何正确清除僵尸进程,以确保系统的正常运行。1Linux僵尸进程子进程完成任务后,如果父进程没有及时检查状态,子进程将成为僵尸进程。子进程在等待父进程确认,完成后系统才会回收。否则,僵尸进程会继续悬挂在系统中。要检查系统中是否存在僵尸进程,可通过运行命令top来查看所有正在运行的进程及可能存在的僵尸进程。‘top’命令的结果从上图可以看到Linux中进

Linux进程优先级调整方法详解 Linux进程优先级调整方法详解 Mar 15, 2024 am 08:39 AM

Linux进程优先级调整方法详解在Linux系统中,进程的优先级决定了其在系统中的执行顺序和资源分配情况。合理调整进程的优先级可以提高系统的性能和效率。本文将详细介绍Linux中如何调整进程的优先级,并提供具体的代码示例。一、进程优先级概述在Linux系统中,每个进程都有一个与之相关联的优先级。优先级的范围一般是-20到19,其中-20表示最高优先级,19表

swoole协程如何在laravel中使用 swoole协程如何在laravel中使用 Apr 09, 2024 pm 06:48 PM

Laravel 中使用 Swoole 协程可以并发处理大量请求,优势包括:并发处理:允许同时处理多个请求。高性能:基于 Linux epoll 事件机制,高效处理请求。低资源消耗:所需服务器资源更少。易于集成:与 Laravel 框架无缝集成,使用简单。

swoole和workerman哪个好 swoole和workerman哪个好 Apr 09, 2024 pm 07:00 PM

Swoole 和 Workerman 都是高性能 PHP 服务器框架。Swoole 以其异步处理、出色的性能和可扩展性而闻名,适用于需要处理大量并发请求和高吞吐量的项目。Workerman 提供了异步和同步模式的灵活性,具有直观的 API,更适合易用性和处理较低并发量的项目。

swoole_process 怎么让用户切换 swoole_process 怎么让用户切换 Apr 09, 2024 pm 06:21 PM

Swoole Process 中可以让用户切换,具体操作步骤为:创建进程;设置进程用户;启动进程。

swoole框架怎么重启服务 swoole框架怎么重启服务 Apr 09, 2024 pm 06:15 PM

要重启 Swoole 服务,请按照以下步骤操作:检查服务状态并获取 PID。使用 "kill -15 PID" 停止服务。使用启动服务的相同命令重新启动服务。

See all articles