PHP 是单进程单线程的疑问和高并发的问题

疑问:

  1. php是单进程单线程的吗
    2.单线程的又如何处理高并发的呢(web服务器是apache)
  2. 耳朵都听出茧子的商品超卖问题,php代码中使用redis(利用redis的特性)就能防止此类问题的发生吗

自己查阅了相关的资料,虽然有了自己的理解,但感觉理解不是很透彻,有大佬分享自己的见解吗

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 4
wanghan

我的理解是:
不是单进程,进程表示你的程序实例,php不含有实例,fpm模式下,每一个fpm都是一个php线程,所以php应该是单线程的。
高并发在普通fpm模式下取决于fpm数量,同一时刻有多少fpm就可以处理多少并发,超卖问题就用redis控制,原子操作,速度还快

4年前 评论

php是单进程单线程单
单fpm是多进程单线程单
,超卖问题就用 redis 控制 处理好 db缓存一致性就可以了

4年前 评论

ps -aux | grep php 看到的应该都是进程吧, php 不止一个吧.

node 这种倒是真是单进程的(单核 cpu 的话)

4年前 评论

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 岗位接触的面试官来说,问这个问题多数是冲冲场面,你给他讲这些基本没啥用)建议看面试官水平采用不同的回答,一般就采用网上回答:负载均衡,静态化,缓存。。。

对于超卖这个问题:这是一个业务上的问题,一般采用队列(排队处理)或者锁机制来处理

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!