作为一名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();
网友评论