进程那些事儿

作者: 响呼雷 | 来源:发表于2021-12-23 11:31 被阅读0次

    作为一名phper,最烦听到php这干不来,那干不来。但不耽误我们深入学习进阶型知识。

    进程:

    白话讲,比如我们打开了英雄联盟、QQ、微信等,我们先理解一个应用程序开启了一个进程,比如我们都打开过任务管理器(ctrl+alt+del、ctrl+shift+esc),在进程那一栏就是我们打开的应用,这就是进程了。那多进程是怎么回事呢?

    多进程:

    比如联盟比赛,当天登录游戏的人很多需要排队,一个人1秒,100w人,100w÷3600≈277小时,可能吗?这个时候开起20个进程,就可以提高20倍的速度了,类似我们物理上学的并行,一次处理20人登录游戏。用php理解就是:php-fpm是fast-cgi的进程管理器,启动之后会启动多个fast-cgi进程,等待任务处理,在php-fpm软件层面,fast-cgi的多个进程就属于多进程处理,但是,当用户发起请求,由nginx交给php-fpm处理请求时,在这个层面,每个请求其实只占有一个php fast-cgi进程进行处理逻辑,对于运行业务逻辑的这个php进程,其实是单进程的。

    上个demo吧,pcntl扩展(pcntl是php官方的多进程扩展,只能在linux环境使用)

    $query = "select * from user";
    $data = file_get_content();
    $resp = json_decode($data,true);
    //新开一个子进程,上面的变量内存将会复制一份到子进程中.这个函数,在主进程中返回子进程进程id,在子进程返回0,开启失败在主进程返回-1**背会
    $pid = pcntl_fork();
    echo "这下面的代码,将会被主进程,子进程共同执行";
    if($pid>0){//主进程代码
        echo "我是主进程,子进程的pid是{$pid}\n";
    }elseif($pid==0){
        echo "我是子进程,我的pid是".getmypid()."\n";
    }else{
        echo "我是主进程,我现在慌得一批,开启子进程失败了\n";
    }
    
    进程通讯

    进程之间其实是互不联系的,这么理解,我们登录了英雄联盟,想看一下都谁在线,突然你的好友”爷傲奈我何“上线了,比如你和”爷傲奈我何“打开联盟是两个紫禁城,他上线了推送到了你的聊天框,说明他们之间通信了。那通讯有哪些方式呢?
    可以使用以下几种方式进行:
    -管道通信
    -消息队列
    -进程信号
    -共享内存
    -套接字通讯,socket
    -第三方,如musql、redis等
    看到这里,你要端正一个思想“不要觉得理论知识不重要!”。这句话提醒那些和我一样的人。
    多搜搜自己不会的知识,看完不会也没事,要先了解,有自己的想法。

    进程信号

    esayswoole
    PHP基础知识以下都要看好一遍奥,你会有意想不到的收获

    再啰嗦一句

    当你看完上面的"PHP基础知识",你可能之前接触过swoole,没接触过也没关系,在此之前你一定要知道什么是回调函数*,你可以先用call_user_func函数演习一下,玩一玩,会用之后你会发现swoole也是一样的原理
    下面这段代码,你无论是再swoole文档还是在一些swoole衍深框架中都是很常见的,从我们第一步实例swoole,配置参数,配置回调,无论你实例的SwoolerServer还是Http\Server还是WetSocket,在没有start之前,都是配置。我们看到的“Connect,Receive,Close,Open,Message,Request等”都是回调,里面的逻辑都可以在swoole连接成功再去完善

    <?php
    // new 一个SwoolerServer对象 并指定监听端口 和运行模式 以及Socket类型
    // 此时的一切一切 都是开发者进行配置的时间,没有任何其他事情发生
    $server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
    // 设置运行参数, 就像你平时做的那样,给$server 对象配置相关的参数
    $server->set([
        'worker_num' => 4,    // 工作进程数量
        'daemonize' => true,  // 是否以守护进程模式运行
        'backlog' => 128,     // Listen队列长度
    ]);
    // 注册事件回调函数
    // 这里指 当底层Tcp新连接进入事件时 交给Tcp 类的 onConnect 静态方法处理
    $server->on('Connect', [Tcp::class, 'onConnect']);
    // 这里指 当收到数据时 交给Tcp 类的 onReceive 静态方法处理
    $server->on('Receive', [Tcp::class, 'onReceive']);
    // 这里指 当Tcp客户端连接关闭时 交给Tcp 类的 onClose 静态方法处理
    $server->on('Close', [Tcp::class, 'onClose']);
    
    start
    // 启动Swole Server 将由 Swoole 接管php运行
    $server->start();
    

    相关文章

      网友评论

        本文标题:进程那些事儿

        本文链接:https://www.haomeiwen.com/subject/ehlhqrtx.html