LNMP 架构下 PHP 采用 FPM 模式运行(php-fpm worker 进程采用单线程模式运行,同步阻塞,即一个worker 只会处理一个请求,处理完了一个才会处理下一个)
而 LAMP 架构下,PHP 是作为 apache mod 运行的,印象中 apache 采用 fork 模式运行(记不太清楚了)即请求来了之后 fork 一个子进程处理该请求,处理完之后,回收该子进程
对于高并发这个问题:
首先得问清楚是多大并发:
C10K,C100K,C10M,C100M?
其次得问清楚是服务器得配置:
服务器的物理资源(网络,内存,核数)决定它上限,且取决于最低的一项(比如带宽10m,而每个客户端占用 200k,那么最高约等于 10m/200k),而单机的物理资源不可能无限扩展,所以单机能处理的并发是有上限的
明确了这两点前提之后才能回答这个高并发得问题,对于不同的软件架构,系统的瓶颈不同:
假定单机 C10k 并发,架构是 LNMP
瓶颈可能是数据库,php-fpm,一般不可能是 nginx 和 操作系统,如果是数据库瓶颈又得考虑应用场景是(读多写少还是写多读少,是否要求强一致性等?)如果是 php-fpm 可以多启动几个 worker 进程或者动态启动 worker 进程(一般是 CPU 核心得倍数(又要考虑是逻辑核心还是超线程))
C10M 并发及以上
这种场景不是 PHP 能胜任得,一般采取分布式架构。这个太深入了,我就不班门弄斧了。
总之高并发问题从来不是一个单独的点,得从全局出发。一般面试问这种问题得面试官我觉得要么是半壶水,要么就是敷衍你(以我在成都面试个多个 PHP 岗位接触的面试官来说,问这个问题多数是冲冲场面,你给他讲这些基本没啥用)建议看面试官水平采用不同的回答,一般就采用网上回答:负载均衡,静态化,缓存。。。
对于超卖这个问题:这是一个业务上的问题,一般采用队列(排队处理)或者锁机制来处理