一起从根上学习Swoole

简介: 一起从根上学习Swoole

一起从根上学习Swoole

Swoole,这个名字已经不再是一个简单的扩展库,而是一种让PHP开发者们心驰神往的技术。它是一个基于事件驱动的异步网络通信框架,能够让PHP应用程序在高并发环境下实现卓越的性能表现。现在,你也可以像一名高超的工程师一样,彻底掌握Swoole的精髓,让你的PHP应用程序达到前所未有的速度和可靠性。


如果你是一名PHP开发者,你一定知道PHP的瓶颈之一是它的同步阻塞式I/O模式。这意味着当一个PHP应用程序需要等待某个I/O操作完成之后才能继续执行下一条语句时,整个进程就会被阻塞。这种模式在高并发环境下很容易导致进程崩溃,造成用户体验的恶化。但是,现在,有了Swoole,你可以轻松地实现异步非阻塞I/O模式,让你的应用程序在高并发环境下保持稳定和高效。


Swoole的强大之处不仅仅在于它的异步非阻塞I/O模式,它还能够实现协程、定时器、进程管理和内存共享等功能。这些功能使得Swoole成为PHP开发者进行高并发、大流量应用程序开发的不二之选。


不要再让你的应用程序被同步阻塞式I/O模式拖累,不要再让用户体验受到影响。学习Swoole,你将拥有一个强大的工具,让你的应用程序在高并发环境下实现更快的响应速度、更高的并发处理能力、更稳定的性能表现。Swoole已经成为PHP开发者们的必备技能之一,现在就加入这个行列吧!


PHP运行模式


cgi协议模式

通用网关接口,允许web服务器通过特定的协议与应用程序通信:

用户请求->Web服务器接收请求->fork子进程 调用程序/执行程序->程序返回内容/程序调用结束->web服务器接收内容->返回给用户

由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低


fast-cgi模式

cgi模式的升级版,它是一个常驻性的cgi,只要开启后,可一直处理请求,不再需要结束进程。

web服务器fast-cgi进程管理器初始化->预先fork n个进程

用户请求->web服务器接收请求->交给fast-cgi进程管理器->fast-cgi进程管理区接收,给其中一个空闲fast-cgi进程处理

->处理完成,fast-cgi进程变为空闲状态,等待下次请求->web服务器接收内容->返回给用户


模块模式

把php作为apache的模块随apache启动而启动,接收到用户请求时则直接通过调用mod_php模块进行处理。


php-cli模式

命令行模式,与常规web模式不同:没有超时时间,默认关闭buffer缓冲,标准输入输出错误的使用,可使用swoole扩展。


php进程模型


php-fpm是什么?

fastcgi进程管理器,用于替换PHP fastcgi的大部分功能,功能包含有:

平滑停止/启动的高级进程管理功能,标准输入输出错误日志记录,文件上传优化支持,

在发生意外情况的时候能够重新启动并缓存被破坏的opcode,慢日志记录脚本


php-fpm工作机制

php-fpm启动->生成n个fast-cgi协议处理进程->监听一个端口等待任务

用户请求->web服务器接收请求->请求转发给php-fpm->php-fpm交给一个空闲进程处理

->进程处理完成->php-fpm返回给web服务器->web服务器接收数据->返回给用户


php-fpm问题

  • 并发性能

在一个进程内,同时只会处理一个请求,也就是说,一个worker进程,这个进程内,同一时刻,只会处理一个请求,并发性能就是你worker能开多少的问题,你有100个进程,同时只能处理100个请求,剩下的只能等着排着队,这个是php-fpm并发性能不好的根本原因,无限制开启这个进程,会导致cpu把大量的开销浪费在进程的上下文切换上,带来更大的开销


一个worker就是一个进程,进程是隔离的,一个进程同一时间内只会处理一个请求,这个进程内所有变量资源都是独立的,请求结束,会将这些资源清理,保证不会被污染,优点是简单上手。


swoole进程模型

介绍swoole

swoole虽然是标准的php扩展,实际上与普通的扩展不同。普通的扩展只是提供一个库函数,而swoole扩展在运行后会接管php的控制权,进入事件循环。当IO事件发生后,swoole会自动回调指定的PHP函数。


swoole和php-fpm的区别是swoole不依赖于php-fpm。


swoole工作机制

使用swoole的时候,先注册了一些回调函数,使用server start,也会创建一个master进程,然后会预创建n个worker进程,每个worker进程都会独立处理请求,和php-fpm没什么区别。


区别是在于,swoole的worker进程执行完之后,不会退出,也不会做任何清理,它只会继续的执行下一个请求,

php-fpm每一次请求过来的时候,它都会重新从index.php读取和加载,是因为它整个的php执行信息清理掉了。


而swoole这种常驻进程,是把所有代码预先注册到回调函数里面去,它什么都没有处理,它一直再等待你的事件,发生事件进行回调。

都是多进程模型。


swoole的进程模型

swoole会创建一个manager进程专门管理work和task进程。而work进程是直接通过unix socket和master进程通讯。


swoole生命周期

变量、对象、资源、require/include的文件等有四种生命周期

  • 程序全局期

在Server->start之前就创建好的对象,称之为程序全局生命周期,这些变量再程序启动后就会一直存在,直到整个程序结束运行才会销毁。

程序全局对象所占用的内存是worke进程间共享的,不会额外占用内存。这部分内存会在写时分离,在worker进程内对这些对象进行写操作时,会自动从共享内存中分离,变为进程全局对象。

include/require的代码,必须在整个程序shutdown时才会释放,reload无效。

  • 进程全局期

Server启动后会创建多个进程,每个worker子进程处理的请求数超过max_request配置后,就会自动销毁。

Worker进程启动后创建的对象(onWorkerStart),在这个子进程存活周期之内,是常驻内存的,onConnect/onReceive/onClose中都可以访问它。

include/require的文件,在reload后就会重新加载。

  • 会话期

会话期是在onConnect后创建,或者在第一次onReceive时创建,onClose时销毁。一个客户端连接进入后,创建的对象会常驻内存,直到此客户端离开才会销毁。

php-fpm的会话期,并不能感知,只有单次访问时使用session_start,访问$_SESSION全局变量才能得到会话期。

swoole的会话期的对象直接常驻内存,不需要session_start,可以直接访问对象,执行对象方法。

  • 请求期

请求期是指一个完整的请求发来,也就是onReceive收到请求开始处理,直到返回结果发生response。这个周期所创建的对象,会在请求完成后销毁。

php-fpm请求期和swoole是一样的,请求到来时创建,请求结束后销毁。


协程简介


  1. 同步阻塞的问题

php下每一个进程都是同步阻塞的模型,比如1号请求是查库,2号请求是http请求,两个请求都是耗时1s。

php是一个单线程模型,每一个进程只有一个线程,那么就是说这个请求一旦遇到阻塞,它就会挂起,一直等到有io返回,才会继续往下执行。

io在阻塞的时候,什么都不能干,只能等。

swoole的worker进程是有限的,php解决并发性能不好本质是提高worker处理能理(本质上是提高cpu的利用率),不要以进程为粒度,用协程。

  1. 协程原理

当worker处理一个请求,可能有很多请求,当它遇到一个io操作需要1秒钟,把这部分上下文保存起来,然后处理其他操作。

就是一个请求,一旦遇到了IO操作,立刻就把这份状态保存起来,转去处理第二个请求,第二个遇到IO操作保存,转去第三个请求,依次类推。

  1. swoole协程工作机制

swoole的协程是自动的,当协程内遇上I/O操作(mysql,redis)等时,swoole的协程会自动切换,运行到下一个协程任务中(切换后,I/O继续执行),

直到下一个协程任务完成或者被切换(遇上I/O),如此反复,直到所有协程任务完成,则任务完成。

  1. 协程解决了什么

协程解决了 将一个线程,原来阻塞的时间重新整理,充分利用每一个阻塞的时间,让你每一个请求在同一个线程上交替执行。


目录
相关文章
|
5月前
|
Python
如何最简单、通俗地理解Python模块?
如何最简单、通俗地理解Python模块?
|
7月前
|
PHP
深入理解 Swoole 的底层加载原理
理解 Swoole 扩展的加载原理,最重要的是要搞懂最开始提到的 PHP 扩展加载全流程。我就是在这个全流程的分析上,花了大量的时间。经常分析到一半,发现逻辑不对,然后就反复的分析其中的关联关系。
67 1
|
Linux
【Linux网络编程】服务端编程初体验
【Linux网络编程】服务端编程初体验
106 0
|
开发框架 安全 API
这个web框架,你先要的他都有!
这个web框架,你先要的他都有!
194 0
聊一聊 Deliverer 与 Xhprof 的区别
前几天有位朋友在公众号问我,Deliverer 和 Xhprof 有什么区别吗?一句话:Xhprof是一个排查性能问题的工具,为系统性能做保障;Deliverer 是一个排查 Bug 的工具,为系统可用性服务。
|
网络协议 关系型数据库 Go
swoole| swoole 协程知识点小结
本文要点: - swoole 协程现状一览: 学不动? 其实是更简单了 - 使用 swoole 协程很简单: 开个协程, 协程里写非阻塞代码 - 展望 swoole 协程未来
448 0
|
网络协议 关系型数据库 Go
swoole| swoole 协程用法笔记
swoole| swoole 协程用法笔记
895 0
|
PHP 自然语言处理 网络协议
WCF使用纯代码的方式进行服务寄宿
服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境。通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用,除去上面的两种寄宿方式,还可以以纯代码的方式实现服务的寄宿工作。
895 0
|
测试技术
了解一下Lua,没准用得上
记得在知乎里面有一个网友提问:写工业级别代码是怎样一种体验?褚霸回复到:看lua源码就知道啥叫工业级 什么是Lua,我们有必要花一点时间来了解一下。 做数据库性能测试的时候,很常用的一个工具就是sysbench,而且有一点很特别,默认就是使用了Lua模板,有同学说Lua模板是什么,如果告诉你是一门新的脚本语言,很多同学就头大了,当然sysbench也不是甩手掌柜,已经给你配备了一系列的Lua模板,基本能够满足大多数场景的测试,比如OLTP读写,只读,插入,批量插入等模板。
1976 0

热门文章

最新文章