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 >& ...
随机推荐
- 【模板/经典题型】min-max容斥
一定注意容斥的时候-1的系数多加了1. 然后一种很常见的min-max容斥的策略就是以每个元素的出现时间作为权值. 最后一个出现的时间即为max,也就等价于全集出现的时间.
- 邂逅明下 HDU - 2897
Problem description: 有三个数字n,p,q,表示一堆硬币一共有n枚,从这个硬币堆里取硬币,一次最少取p枚,最多q枚,如果剩下少于p枚就要一次取完.两人轮流取,直到堆里的硬币取完,最 ...
- Linux中计划任务、周期性任务设置
Linux中计划任务.周期性任务设置 计划任务:指在未来的特定时间里,执行一次某一特定任务.当然,如果同一任务需要在不同时间点执行执行两次.三次或多次,可以视为多个一次看待. 周期性任务:指某一任务需 ...
- XXE漏洞
原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码.当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取.系统命令执行.内网端口探测.攻击内网 ...
- ZOJ - 3661 pam
题意:给一个字符串,和每个字符代表的val,每个回文串的价值就是前半部分的val26进制%777777777,求价值第k小的回文串 题解:建个pam,然后dfs两边(0,1),统计价值sort一遍就好 ...
- 【IDEA】【4】遇到的问题
前言: 1,jar包未导入到项目中 2,报错 cannot resolve symbol 3,左边栏只能看到文件看不到项目结构 4,报错 No valid Maven installation fou ...
- mysql索引注意事项
mysql使用索引的注意事项 1.索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的.所以我们在数据库 ...
- 安卓——Activity生命周期、
在xml 设计页面添加标签 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmln ...
- 在ubuntu14中搭建邮箱服务器
1.前提准备 1.1在服务器上安装ubuntu14 1.2为ubuntu14配置静态ip 使用命令 sudo vim /etc/network/interfaces打开配置文件 修改内容如下: 使用命 ...
- 【LeetCode】二分查找
给一个升序数组,找到目标值在数组中的起始和结束位置,时间复杂度为 O(log n). e.g. 给定数组 [5, 7, 7, 8, 8, 10] 和目标值 8,返回 [3, 4].若目标值不在数组中, ...