PHP多进程还是单进程?

一直说PHP是单线程的,但是php-fpm的时候开始对进程进行了优化,一个master可以开启多个work进程,如果有10个work,那他不也是同时运行10个请求吗?这应该算多进程了吧?
有没有知道的大神不吝赐教一下,到底怎么理解的呢?谢谢!!

php
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

其实人们常说的多进程并不是你这样理解的。

  1. 我们常说的多进程是针对某个请求而言的。比如当前有一个request,此时会有一个进程。在PHP的模式下,就只能该进程去处理任务(不考虑其他的扩展类库使用),然而对于Go、Java它可以在此基础上开启新的线程或者协程。

我个人是这么理解的,一家工程十条流水线(一个service,开启10个进程)。PHP是一条流水线只有一个工人(一个线程),而Java、Go可以在每一条流水线上分n个工人(多个线程)。

1年前 评论
bluememory (楼主) 1年前
bluememory (楼主) 1年前
忆往昔弹指间 1年前
7small7 (作者) 1年前
讨论数量: 31

php-fpm单进程

1年前 评论
bluememory (楼主) 1年前

要看你从什么角度去看,你从整体去看,就是多进程的,因为PHP-FPM就是一个进程管理器,它确实是创建了N个进程来处理请求。
你从单个请求处理的角度去看,PHP又是单进程的,本次请求分发给某个进程处理,这时候你并不能在这个进程里去创建其他进程或线程(这里讲的是主流,那些通过某某扩展、某某方式实现的多进程、多线程请忽略)。

1年前 评论
忆往昔弹指间 (作者) 1年前
滚球兽进化 1年前
green_hand 1年前
bluememory (楼主) 1年前
忆往昔弹指间 (作者) 1年前
bluememory (楼主) 1年前
bluememory (楼主) 1年前
滚球兽进化 1年前

1个请求开启一个进程 php-fpm就是单进程的 N个请求开启N个进程 ; cli模式可以 一个进程 开启多个协程 多个协程处理数据 但是本质还是1个进程在运行 多个请求变成多个协程处理的 角度应该按着请求的角度看

1年前 评论
Jyunwaa

在fpm模式下,根据服务器性能和自身业务来调整worker进程数量,可以提高程序并发能力,但是因为进程切换的CPU成本不可忽略,所以worker进程数量不能无限大。

欲充分压榨CPU资源,唯有异步形式的代码,PHP上推荐协程框架Swoole.

1年前 评论
滚球兽进化 1年前
bluememory (楼主) 1年前
kolin 1年前
Jyunwaa (作者) 1年前
Jyunwaa (作者) 1年前
stevehe

php8.1及以上版本原生支持纤程(Fibers),这样说来,应该是多线程吧。 www.php.net/manual/en/language.fib...

1年前 评论

也不知道理解的對不對,php-fpm 单进程,在nginx + PHP的情況下,nginx會開啓一個PHP進程然後關閉(多次訪問就會開啓多個PHP進程執行完后關閉)。後面好像有個類似工作進程的東西,不過有點搞不清楚是nginx的還是PHP的(主進程調用工作進程)。swoole(沒用過)好像是占用一塊内存空間然後一直運行,快速切換請求。

1年前 评论

其实人们常说的多进程并不是你这样理解的。

  1. 我们常说的多进程是针对某个请求而言的。比如当前有一个request,此时会有一个进程。在PHP的模式下,就只能该进程去处理任务(不考虑其他的扩展类库使用),然而对于Go、Java它可以在此基础上开启新的线程或者协程。

我个人是这么理解的,一家工程十条流水线(一个service,开启10个进程)。PHP是一条流水线只有一个工人(一个线程),而Java、Go可以在每一条流水线上分n个工人(多个线程)。

1年前 评论
bluememory (楼主) 1年前
bluememory (楼主) 1年前
忆往昔弹指间 1年前
7small7 (作者) 1年前

多进程吧?我的理解是FPM管理了多个phpcgi进程,我不是很确定 :flushed:

1年前 评论
勇敢的心 (作者) 1年前

PHP默认情况下是多进程的(fpm方式)

本质上你的代码就是在多个进程中执行,所以你必须要做好并发控制,否则很有可能出现资源不一致的情况。

1年前 评论

PHP 是一门脚本语言,它本质上是单进程单线程的。也就是说,PHP 的进程和线程都是在脚本执行期间自动创建和销毁的,并且在脚本执行完毕后会被系统自动回收。但是,可以通过多种方式在 PHP 中使用多进程。 1.可以使用 PHP 的 pcntl_fork() 函数来创建子进程。 2.也可以使用 PHP 的 pthreads 扩展 3.使用 Swoole ,workerman 框架

1年前 评论

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