当前位置:首页 > Web开发 > 正文

而多进程模式就要用到管道、消息队列、共享内存

2024-03-31 Web开发

并发 IO 问题一直是处事器端编程中的技术难题,从最早的同步梗阻直接 Fork 进程,到 Worker 进程池/线程池,到此刻的异步IO、协程。PHP 措施员因为有强大的 LAMP 框架,对这类底层方面的常识知之甚少,本文目的就是详细介绍 PHP 进行并发 IO 编程的各类测验考试,最后再介绍 Swoole 的使用,深入浅出全面解析并发 IO 问题。

多进程/多线程同步梗阻

最早的处事器端措施都是通过多进程、多线程来解决并发IO的问题。进程模型呈现的最早,从 Unix 系统诞生就开始有了进程的观点。最早的处事器端措施一般都是 Accept 一个客户端连接就创建一个进程,然后子进程进入循环同步梗阻地与客户端连接进行交互,收发措置惩罚惩罚数据。

技术图片

多线程模式呈现要晚一些,线程与进程对比更轻量,而且线程之间是共享内存仓库的,所以差此外线程之间交互非常容易实现。好比聊天室这样的措施,客户端连接之间可以交互,比聊天室中的玩家可以任意的其他人动员静。用多线程模式实现非常简单,线程中可以直接向某一个客户端连接发送数据。而多进程模式就要用到管道、动静行列队伍、共享内存,统称进程间通信(IPC)庞大的技术才华实现。

$serv = stream_socket_server("tcp://0.0.0.0:8080",$errno,$errstr); while(1){ $conn = stream_socket_accept($serv); if(pcntl_fork()==0){//子进程 $content = fread($conn,1024); echo $content; echo PHP_EOL; $str="sdjifdsjfisdjfdsif"; fwrite($conn,$str); fclose($conn); exit(0); } }

多进程/线程模型的流程是

创建一个 socket,绑定处事器端口(bind),监听端口(listen),在PHP顶用stream_socket_server一个函数就能完成上面3个法式,固然也可以使用更底层的sockets扩展分袂实现。

进入while循环,梗阻在accept操纵上,期待客户端连接进入。此时措施会进入睡眠状态,直到有新的客户端倡议connect随处事器,操纵系统会唤醒此进程。accept函数返回客户端连接的socket

主进程在多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)创建子线程。下文如无特殊声明将使用进程同时暗示进程/线程。

子进程创建告成后进入while循环,梗阻在recv(php: fread)挪用上,期待客户端向处事器发送数据。收到数据后处事器措施进行措置惩罚惩罚然后使用send(php: fwrite)向客户端发送响应。长连接的处事会连续与客户端交互,而短连接处事一般收到响应就会close。

当客户端连接封锁时,子进程退出并销毁所有资源。主进程会回收失此子进程。

这种模式最大的问题是,进程/线程创建和销毁的开销很大。所以上面的模式没步伐应用于非常繁忙的处事器措施。对应的改造版解决了此问题,,这就是经典的 Leader-Follower 模型

$serv = stream_socket_server("tcp://0.0.0.0:8080",$errno,$errstr); for($i=0;$i<10;$i++){ if(pcntl_fork() == 0 ){ while(1){ $conn = stream_socket_accept($serv); if($conn == false){ continue; } $content = fread($conn,2048); echo $content; echo PHP_EOL; $str="this is testdata"; fwrite($conn,$str); } exit(0); } }

它的特点是措施启动后就会创建N个进程。每个子进程进入 Accept,期待新的连接进入。当客户端连接随处事器时,此中一个子进程会被唤醒,开始措置惩罚惩罚客户端请求,并且不再接受新的TCP连接。当此连接封锁时,子进程会释放,从头进入 Accept ,参预措置惩罚惩罚新的连接。

这个模型的优势是完全可以复用进程,没有特别消耗,性能非常好。很多常见的处事器措施都是基于此模型的,好比 Apache 、PHP-FPM。

多进程模型也有一些错误谬误。

这种模型严重依赖进程的数量解决并发问题,一个客户端连接就需要占用一个进程,事情进程的数量有几多,并发措置惩罚惩罚能力就有几多。操纵系统可以创建的进程数量是有限的。

启动大量进程会带来特别的进程调理消耗。数百个进程时可能进程上下文切换调理消耗占CPU不到1%可以忽略不计,如果启动数千甚至数万个进程,消耗就会直线上升。调理消耗可能占到 CPU 的百分之几十甚至 100%。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30773.html