php-fpm的工作方式

php-fpm就是php-fastcgi进程管理器

主要工作的就是mastr进程,主要和linux进行一个协调,当请求从nginx到fpm的时候,master会把请求交给自己下面管理的子进程一个池模型,

问题:一个work进程内只会处理一个请求,也就是说这个进程内在同一时刻只会处理一个request请求,不会处理多个,所以一台服务器的并发数就取决于服务器开启了多少个work进程数决定的,假如开启了100个进程,剩下的所有请求,就只能在后面等着,排着队。所以这也是php-fpm并发性能不好的根本原因,如果无限制的开启大量进程,那么电脑的cpu性能会耗费在进程的上下文切换上,会带来更大开销。

Swoole进程模型以及生命周期

Swoole不简单是一个php扩展,它完全不依赖于php-fpm,它是一种长驻进程多进程模型,就是说每次一个request请求完毕,swoole的work进程不会清理,php文件是常驻进程内的,而php-fpm是每次请求都会清理work进程,重新加载php文件,这也是为什么swoole服务修改代码后,必须重新加载服务才会生效的原因。在使用swoole时候需要注意它的生命周期,不要在onrequest以外定义全局变量,防止内存泄漏,swoole官方有提供max_request参数,防止内存泄漏。

swoole协程

Php work 进程是同步阻塞的,php代码从上刀下执行,如果期间有io操作那么这个请求就会阻塞卡在那儿等待io操作完成,然而work进程是有限的,假如启动了3个work进程,一个request请求是1秒,那么这一秒最多处理3个请求,这也就极大的限制了系统的并发量。携程就是可以极大的利用服务器的cpu资源开销,当一个request请求中间有io等耗时操作,就可以使用携程把这个操作挂起,这样work进程就不会阻塞等待,继续接受下一个请求。它是一个交替执行的过程。

controller 类定义私有属性需要注意每次request属性是不会初始化的。

如果需要初始化加入easyswoole框架的gc方法

协程+Channel+WaitGroup实现并发编程

<?php
include_once '../vendor/autoload.php';
use Swoole\Coroutine as co;
go(function (){$time = time();$chan = new co\Channel(12);//管道$wait = new \EasySwoole\Component\WaitGroup(12);//模拟查询for($i=1;$i<=12;$i++) {$wait->add();//+1go(function () use ($wait,$chan,$i){co::sleep(rand(1,1));$chan->push("第个{$i}月的数据");$wait->done();//-1});}$wait->wait();//等待while(true) {if($chan->isEmpty()) {break;}$res = $chan->pop();//输出error_log($res . PHP_EOL,3,'channel.log');}error_log('----------------------'. PHP_EOL,3,'channel.log');error_log(time()-$time,3,'channel.log');
});

自定义进程,并向自定义进程发送信号

1 自定义进程类

<?phpnamespace App\HttpController\Test;
use EasySwoole\Component\Process\AbstractProcess;
use Swoole\Coroutine;
use Swoole\Process;
class ProcessOne extends AbstractProcess
{private $data = [];/*** 业务逻辑* @param $arg*/protected function run($arg){// TODO: Implement run() method.$processName = $this->getProcessName(); // 获取 注册进程名称$swooleProcess = $this->getProcess(); // 获取 注册进程的实例 \Swoole\Process$processPid = $this->getPid(); // 获取 当前进程 Pid$args = $this->getArg(); // 获取 注册进程时传递的参数//接收参数$size = $arg['size'];go(function () use ($size) {while (true){//写入数据$this->data[] = 'easyswoole';if(count($this->data) > $size) {//判断参数则进行报警echo '报警提示' . PHP_EOL;}var_dump(count($this->data));//sleep 1Coroutine::sleep(1);}});}/*** 信号接收方法* @param Process $process*/protected function onPipeReadable(Process $process){// 该回调可选// 当主进程对子进程发送消息的时候 会触发$recvMsgFromMain = $process->read(); // 用于获取主进程给当前进程发送的消息var_dump('收到主进程发送的消息: ');var_dump($recvMsgFromMain);switch ($recvMsgFromMain) {case 'clear':$this->data = [];break;default:echo '命令非法';}}protected function onException(\Throwable $throwable, ...$args){// 该回调可选// 捕获 run 方法内抛出的异常// 这里可以通过记录异常信息来帮助更加方便地知道出现问题的代码}protected function onShutDown(){// 该回调可选// 进程意外退出 触发此回调// 大部分用于清理工作}protected function onSigTerm(){// 当进程接收到 SIGTERM 信号触发该回调}
}

2 EasySwooleEvent.php

 public static function mainServerCreate(EventRegister $register){$processConfig = new \EasySwoole\Component\Process\Config(['processName' => 'test1', // 设置 自定义进程名称'processGroup' => 'Custom', // 设置 自定义进程组名称'arg' => ['size' => '3'], // 【可选参数】设置 注册进程时要传递给自定义进程的参数,可在自定义进程中通过 $this->getArg() 进行获取'enableCoroutine' => true, // 设置 自定义进程自动开启协程]);$obj = new ProcessOne($processConfig);\EasySwoole\Component\Process\Manager::getInstance()->addProcess($obj);\EasySwoole\Component\Di::getInstance()->set('test1', $obj->getProcess());

3 发送信号方法

$customProcess = Di::getInstance()->get('test1');// 向自定义进程中传输信息,会触发自定义进程的 onPipeReadable 回调$customProcess->write('clear');

未完待续。。。

easyswoole学习记录相关推荐

  1. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  2. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

  3. springboot @cacheable不起作用_Springboot学习记录13 使用缓存:整合redis

    本学习记录的代码,部分参考自gitee码云的如下工程.这个工程有详尽的Spingboot1.x教程.鸣谢! https://gitee.com/didispace/SpringBoot-Learnin ...

  4. 【Cmake】Cmake学习记录

    Cmake学习记录 1.1 常例 add_library(gen_reference_infogen_reference_info/gen_reference_info.hgen_reference_ ...

  5. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  6. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  7. add函数 pytorch_Pytorch学习记录-Pytorch可视化使用tensorboardX

    Pytorch学习记录-Pytorch可视化使用tensorboardX 在很早很早以前(至少一个半月),我做过几节关于tensorboard的学习记录. https://www.jianshu.co ...

  8. java之字符串学习记录

    java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...

  9. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

最新文章

  1. linux动态库替换,不要使用 cp 替换正在使用中的Linux 动态库
  2. 各排序算法的C++实现与性能测试(转)
  3. how does tomcat access js - SAPUI5 Core Libraries
  4. 新的网站上线 linux视野
  5. Windows 7 64位下使用ADB驱动
  6. MII2RGMII IP核使用设计举例
  7. 竹子的故事:送给那些坚持了很久却准备放弃的人 --- 厚积方能薄发
  8. UG NX二次开发-外部模式
  9. nginx处理redirect location端口丢失的问题
  10. MYSQL给表或者字段写注释
  11. mysql修改数据库名的方法
  12. 小马哥 ------高仿三星S5刷机 高仿三星G9006系列拆机主板机型图与开机界面图
  13. 简单模拟struts框架,了解strusts的框架实现机制
  14. 【Kotiln】 错误锦集- Caused by: kotlin.NotImplementedError: An operation is not implemented: not implemen
  15. 内涵段子爬取及re匹配
  16. 模拟一个具有基本功能的操作系统(JavaGUI)
  17. 第四部分 查找:两个经典二分查找算法
  18. 编辑器 Typora 开始收费,开源免费的 MarkText 火了:一周剧增 2k+star
  19. Spring相关文章汇总篇【Spring,SpringBoot,SpringCloud等】
  20. 度量衡计算工具_在线度衡量转换器

热门文章

  1. Scrapy爬虫 爬取豆瓣TOP250
  2. GraphicsMagick之实践出真知
  3. 改进的sobel算法和色调信息的叶脉提取 c语言,基于窗口动态阈值改进Canny算子的叶脉提取算法的制作方法...
  4. urllib3批量下载百度图片
  5. 2021最新版去水印小程序,源码,带搭建详细教程
  6. python中浮点单精度用什么表示_不方便在numpy中使用单精度浮点
  7. C语言 寻找亲密数对
  8. Mybatis(一)之概述
  9. 为什么你的时间总是不够用?
  10. 电脑怎么录屏并保存?您可以试试这3个方法