一起从根上学习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. 协程解决了什么

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


目录
相关文章
|
3月前
|
消息中间件 安全 Java
Linux源码阅读笔记13-进程通信组件上
Linux源码阅读笔记13-进程通信组件上
|
3月前
|
Linux
Linux源码阅读笔记13-进程通信组件中
Linux源码阅读笔记13-进程通信组件中
|
API PHP 调度
PHP的事件驱动是什么意思?底层原理是什么?
PHP的事件驱动是什么意思?底层原理是什么?
134 0
PHP的结构化编程是什么意思?底层原理是什么?
PHP的结构化编程是什么意思?底层原理是什么?
119 0
|
网络协议 NoSQL 关系型数据库
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
427 0
《Linux多线程服务端编程:使用muduo C++网络库》学习笔记,★firecat推荐★
|
iOS开发
iOS网络编程之三——NSURLConnection的简单使用
iOS网络编程之三——NSURLConnection的简单使用
165 0
iOS网络编程之三——NSURLConnection的简单使用
聊一聊 Deliverer 与 Xhprof 的区别
前几天有位朋友在公众号问我,Deliverer 和 Xhprof 有什么区别吗?一句话:Xhprof是一个排查性能问题的工具,为系统性能做保障;Deliverer 是一个排查 Bug 的工具,为系统可用性服务。
|
PHP 自然语言处理 网络协议
|
Windows
[转载]Windows网络编程系列教程之四:Select模型
原文:http://www.51see.com/asp/bbs/public/bp_show.asp?t_id=200308131152297103讲一下套接字模式和套接字I/O模型的区别。先说明一下,只针对Winsock,如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套,那就不关我的事。
888 0