Loading

结合PHP,说下你了解的服务器进程模型有哪些?

由于PHP没有可靠可用的线程,所以只能用进程来顶上去,那么我们常见的服务器模型有哪些呢?

  1. 单进程类型。一个主进程,启动后开始一个监听socket。客户端有请求了,就accept,然后处理业务,最后将处理好的数据write给客户端。在主进程处理业务期间,如果有其他客户端来请求,那么就只能很悲催的等待。

  2. On Demand Fork类型。这种进程模型中,主进程启动后开始一个监听socket,然后一直监听请求,一旦有客户请求,立马fork一个新的进程来处理这个客户端的请求,当然了此时主进程可以继续去处理其他客户端请求,算是解放了主进程。fork出来的子进程在处理完完毕数据write给客户端后,就会被回收掉。这种模型有一个很大的问题,那就性能很有可能被浪费。因为来一个请求,就fork一个进程,fork本身就是极为珍贵的系统调用,其次是好不容易fork出来的进程,一会儿还会被销毁。如果有人恶意滥发请求,那么系统就会随着请求fork进程,系统最终boom!

  3. On Demand Fork的升级版本。这种模型中,主进程启动后开始一个监听socket,同时还会fork出固定数量的进程用来处理业务。这样,最大的好处就是一定程度上提升了性能,其次是保护了服务器不会被恶意攻击。总体说来,apache的基本模型就是采用的这种模式;当然了,我们耳熟能详的php fpm的进程模型也大概与这个极为类似!

OK,这三种模式基本上可以归结为同步阻塞类型。这类模型往往都是通过维系大量的进程来解决并发问题,并发越高,就必须要提供更多的进程数量。

  1. 事件监听模型。这种情况下,主进程在启动后,开始一个监听socket,然后再开启少量子进程,每个子进程中会将监听socket添加到事件循环中(往往都是select或者epoll),借助于epoll或select来实现高性能异步非阻塞。此时,主进程的作用往往是监管子进程,比如子进程异常了,就拉起一个新的等等。nginx就是这种模型的一个典型实现!在PHP中,workerman也是这种实现的一个典型(注意swoole比较特殊,进程模型要比这个复杂些许)

现在,第四种服务器模型基本上是解决高性能高并发的主流方案。

 

转:https://t.ti-node.com/

posted @ 2018-09-10 10:40  王召波  阅读(741)  评论(0编辑  收藏  举报