很多小型的规模场景限制下,复杂概念弊端大于利端。不同模式的实现,是根据具体需求来判定,但是理解底层最基础的原理有助于理解很多工具背后的诞生。比如php的swoole workerman 要解决的问题。
首先理解,进程概念,进程(Process)是指正在运行中的程序的实例。当一个程序被加载到内存中并开始执行时,它就成为一个进程。每个进程都有自己的地址空间、内存、数据栈以及其他用于管理运行时所需资源的系统属性。用通俗的我们可视化的角度,就是我们在win里面点开一个exe执行文件,然后可以在任务管理器里面可以看到该任务运行。点开我们win的任务管理器,密密麻麻的,我们看到的都是一个个进程,也就是我们电脑当前运行了这么多进程,只是并不是每个进程我们都在用,很多进程是在背后默默工作的。
而在Linux的进程同样,可以看到茫茫的进程,从每个pid代表了一个当前正在运行的进程,保持着系统的稳定或者运行了某种功能。而需要说明的,有些程序为了提升软件的运行稳定性,会开多个进程。比如我们最常用的web服务器,nginx.,当前默认情况下,会开四个进程(这个是可以通过配置设定)。但是我们会发现其实它们都是有个主进程的,是1413,
为啥nginx要开这么多进程呢,其实是为了提升nginx自身的性能,还有防止一些异常错误导致服务器的崩溃,而在通常情况下,不同的进程有以下不同的通途:
主进程(Master Process):主进程是 Nginx 的管理者,负责控制其他所有的工作进程。主要任务包括接受来自管理员或者控制台的信号,管理工作进程的生命周期,以及在需要时重新加载配置文件或者重启服务。主进程通常只有一个。
工作进程(Worker Processes):工作进程是实际处理客户端请求的进程。Nginx 通过配置文件中的 worker_processes 指令来指定启动多少个工作进程。每个工作进程是独立运行的,它们并发地处理客户端的请求,可以充分利用多核处理器的性能优势。每个工作进程之间是相互独立的,不共享内存空间,这样可以提高系统的稳定性和安全性。
Cache Loader 进程(Cache Loader Process,可选):当 Nginx 使用了文件缓存(例如代理缓存或者 FastCGI 缓存)时,会有一个专门的 Cache Loader 进程负责预加载缓存文件到内存中,以加速对这些文件的访问。这个进程通常在启动时创建,完成加载后就退出。
事件处理器(Event Handler): Nginx 使用事件驱动模型来处理并发请求,通常会有一个或多个事件处理器进程。这些进程负责监听套接字和处理事件,例如接受客户端连接、读取请求、发送响应等。事件处理器通常与工作进程集成,确保 Nginx 在高并发情况下仍能高效地处理请求。
看完为了nginx服务,nginx软件不惜开启四个进程保持稳定性/可靠性。我们再来看php的进程运行方式。
可以看到php的进程也很多。但是主进程只有一个是1412的主进程。
而PHP 进程被 web(我们这里是nginx) 服务器作为 FastCGI 进程管理器(例如 PHP-FPM)管理,而不是直接由用户调用。每个 PHP 进程在处理客户端请求时会被动态创建,处理完请求后可能会被重用,以提高性能和效率。
也就是在没有php-fpm之前,都是直接cgi模块直接请求php-cgi.exe,这样很快就发现问题,每个用户的请求都要去初始化php,并跑程序代码,于是为了提高请求性能,开发出了php-fpm,专门来管理本来直接cgi到php的链接。于是我们才可以看到php-fpm池子里面这么多程序等待着nginx的请求。
小结: 我们通过日常经验,直观的看到了进程,同时理解了很多软件在设计的时候,通常开辟多进程来保持程序性能和安全的高效性。
这种运行模式稳定运行了很久,从流程上看并没有问题,我们发出一个请求,nginx接收,然后启动php-fpm管理php程序。受制于nginx本身的一些特性,还有php-fpm本身的代码限制,到最后,会发现其实我们可以直接使用一个程序从接收到程序,直接去调度使用php的,这样没有劣质中间商(php-fpm )耗时,必然让我们的请求效率大幅度提升。于是这款底层php的容器叫workerman。
其实到这里php的逻辑已经变了,之前设计的时候,只是写个简单能跑web的脚本,所以就使用自己php-fpm跟web服务器交互的逻辑运行。但是当php的容器改变之后,可以自定义改变端口和实现异步之后,基本一般的IM和简单交互也可以实现。