php多进程和多线程的比较
前言
最近在学习php多进程和多线程的编程。说实话,这两样在工作中几乎都没有用到,毕竟php并不以异步处理擅长,对于网络请求同步处理可以解决绝大多数问题。但是既然有这样的机制,也了解一下,对于以后接触别的语言也有好处。
php处理请求机制
以nginx作为web服务器为例,nginx将对php发起的http请求交给FastCGI进程监听的IP地址及端口,由php-fpm(FastCGI Process Manager)作为动态解析服务器处理,最后再把处理结果交给nginx,nginx再返回给客户端。那么php-fpm如何处理呢?大家可能知道,php-fpm分 master进程和worker进程(如下图,来源网络)。master接受到请求,指派特定的worker进程来处理,worker进程处理请求,返回结果给nginx。想细致了解,可以参考:nginx和php之间是怎样通信的呢,深入理解PHP之:Nginx 与 FPM 的工作机制。

从以上描述我们可以看出,一个单一的php-fpm worker就是同步阻塞,单进程单线程的处理机制。现在我们来讨论的是如何让一个php-fpm worker 实现多进程或多线程,以及这两种机制的比较。先来看看多进程和多线程的相关概念。
多进程和多线程的相关概念
进程:进程是资源分配的最小单位;
线程:线程是CPU调度的最小单位。
选择多进程好还是选择多线程好?需要根据实际情况来判断,下面也是网络上对多线程和多进程的一番对比:

详细的请参考:多进程还是多线程的选择和区别 ,感觉这位牛人写的特别清楚。下面我们再来看看php环境下使用多进程和多线程要注意的。
php下多进程和多线程使用注意事项
安装配置
在php下使用多进程需要开启pcntl扩展。
php下使用多线程需要开启pthread扩展,并且要求在php编译安装的时候就已经设置了线程安全(这个还是比较麻烦,需要重新编译安装php)。
通信机制
多进程和多线程下都可以使用全局变量。
进程间的通信机制是管道(pipe)。
在php下,由于线程安全的实现机制,线程间无法进行通信。
线程安全:线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
PHP 实现的线程安全主要是使用 TSRM 机制对 全局变量和静态变量进行了隔离,将全局变量和静态变量 给每个线程都复制了一份,各线程使用的都是主线程的一个备份,从而避免了变量冲突,也就不会出现线程安全问题。同时 PHP 开启线程安全选项后,使用 TSRM 机制分配和使用变量时也会有额外的损耗。
CPU的使用
从进程和线程的定义就可以知道,cpu一个核同一时间只能处理一个线程。所以单核cpu的服务器就不要考虑使用多线程或者多进程去做任务了,因为切换进程或者线程的开销让使用完全没有意义。但是多进程在守护进程的开发上还是有作用的。这个在单独介绍多进程的文章中详细说明。对于多核cpu可以根据实际情况选择多进程还是多线程。比如网络上很多例子提到的需要并发请求很多url,就可以用到多线程(无需线程间的通信)。
--------------------------------------
2018.4.24补充一下,以上观点是错误的。对于单核CPU,如果任务是I/O密集型,则使用多线程或多进程仍然可以大幅缩短时间,和多核CPU效果是一样的,因为时间的瓶颈不在CPU而在I/O。但是CPU密集型,计算比较多的任务则单核CPU对多进程或多线程没有多大的优化效果。
web环境下使用
web环境下,不能使用多进程,这个官方文档有说明。
web环境下,可以使用多线程。
参考资料:
php多进程和多线程的比较的更多相关文章
- 从Nginx的Web请求处理机制中剖析多进程、多线程、异步IO
Nginx服务器web请求处理机制 从设计架构来说,Nginx服务器是与众不同的.不同之处一方面体现在它的模块化设计,另一方面,也是最重要的一方面,体现在它对客户端请求的处理机制上. Web服务器和客 ...
- gdb调试多进程和多线程命令
gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主 ...
- Python3 多进程和多线程
Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为 ...
- Python中的多进程与多线程(二)
在上一章中,学习了Python多进程编程的一些基本方法:使用跨平台多进程模块multiprocessing提供的Process.Pool.Queue.Lock.Pipe等类,实现子进程创建.进程池(批 ...
- 多CPU,多核,多进程,多线程
当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位(调度单位). 3.一个进程可以包括多个线程. 4.在 ...
- python多进程和多线程
多任务才有多进程和线程: 线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 多进程和多线程的程序涉及到同步.数据共享 ...
- Python多进程vs多线程
多任务的两种方式:多进程和多线程. 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker. 如果用多线程实现Master-Worker,主线程就是Master, ...
- 学习python 多进程和多线程
''' 学习多进程和多线程 ''' import multiprocessing def deadLoop(): while True: pass if __name__ == '__main__': ...
- python 多进程和多线程的区别
了解线程和进程 进程 程序:磁盘上的可执行二进制文件,并无运行状态. 进程:就是一个正在运行的任务实例(存活在内存里). 获取当前电脑的CPU核心数: pip install psutil >& ...
随机推荐
- Prime Ring Problem HDU - 1016
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle ...
- 性能测试工具 Web Service 性能测试工具比较
[转自]https://testerhome.com/topics/3003 背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力 ...
- vue element upload图片 回显问题
beforeUpload (file) { var _this = this; var reader = new FileReader(); reader.readAsDataURL(file); ...
- hdu-6397-容斥
Character Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- 函数使用十二:BAPI_MATERIAL_BOM_GROUP_CREATE(CS61)
REPORT ZSM_CREATE_SIMPLEBOM.* This code will create a material BoM for the material* MAINMATERIAL wi ...
- JS实现下拉单的二级联动
因工作需要,做了一个下拉单的二级联动. 第一级是固定的选项,有A.B两个选项,第二级的选项随着第一级选项的变化而变化. 一开始是这样的: HTML代码 <html> <head> ...
- 2.Liunx 系统设置
1.基本命令:clear 2.环境变量: alias .export 大纲 系统管理命令 1.用户管理:adduser .passwd. userdel 2.用户组管理:groupadd.groupd ...
- weblogic安装教程(以weblogic 11g为例)
1.下载jdk和weblogic安装介质 一般的搭配是jdk1.5+weblogic92.jdk1.6+weblogic11g(weblogic10.3.6) jdk历史版本下载链接:http://w ...
- windows开机锁定小键盘
1.启动注册表编缉器 按下windows+R键,输入regedit回车启动注册表编缉器 2.修改注册表默认值 展开HKEY_USERS\.DEFAULT\Control Panel\Keyboard将 ...
- Swagger 路径过滤 -PreSerializeFilters
Swagger 默认显示所有api, 如果要做路径过滤,可以这样做. //过滤,只显示部分api app.UseSwagger(c=> { c.PreSerializeFilters.Add(( ...