PHP 进程空间的术语大全的庖丁解牛

发布时间:2026/10/15 6:38:28
PHP 进程空间的术语大全的庖丁解牛
核心内核进程空间就是操作系统给一个PHP进程FPM子进程 / CLI进程分配的独立虚拟内存地址空间。承接前面堆、栈、对象、zval整套知识操作系统把内存隔离每个进程拥有属于自己的一套内存地图和别的进程互不干扰PHP代码、加载的类、变量、堆、栈全部容纳在这片隔离的空间之内。类比每一个PHP进程就是一栋独立楼房楼房里面划分多个房间内存分区楼房之间墙壁隔离A楼看不到B楼内部东西。一、本源基础术语进程 Process操作系统资源调度的最小单位。启动php-fpm子进程或者在命令行执行php xxx.php就会创建一个PHP进程。拥有独立进程空间、文件描述符、PID。进程地址空间进程虚拟内存空间操作系统分配给进程的一整套连续虚拟地址。不是物理内存条真实地址是虚拟映射。进程只能访问属于自己这片空间不能直接读取其他进程内存。PID Process ID进程编号操作系统用来识别每一个进程。ps aux | grep php可以查看PHP进程PID。虚拟地址进程内部看到的内存编号。CPU通过页表映射到真实物理内存。物理内存服务器真实内存条硬件。多个进程的虚拟地址可以映射到不同物理内存块。内存隔离操作系统核心机制。进程A无法读写进程B的内存保证安全单个进程崩溃一般不会直接干掉其他进程。二、PHP进程空间内部五大内存分区代码段Text段 / 只读段存放编译后的PHP内核二进制、加载的扩展pdo、redis等。只读运行期间不会修改。多个同类型进程可以共享这一块内存节省物理内存。全局数据段Data / BSS段存放全局变量、静态变量、类静态属性。进程创建时就分配。BSS存放未初始化全局数据。类静态属性就保存在这个区域不在堆、不在对象实例。堆 Heap动态内存区向上增长。前面讲解的对象实例、哈希表、长字符串、资源全部放在堆。PHP内核通过内存池emalloc管理堆内存。受php.inimemory_limit限制。栈 Stack向下增长。保存函数调用栈帧、zval变量容器。函数调用就压入栈帧函数执行结束栈帧自动释放栈空间很小递归太深会栈溢出。共享库区域系统动态库、PHP扩展so文件多个进程可以共享加载同一份库文件。一句话区分代码段只读全局段存静态全局堆存动态创建对象栈存临时函数变量。三、FPM进程空间的生命周期术语FPM Master主进程php-fpm启动先创建Master主进程。负责读取配置、管理子进程、监听端口。Master本身不处理业务请求。FPM Worker子进程Masterfork生成worker子进程每个worker拥有独立进程空间。worker接收HTTP请求执行PHP脚本。fork进程复制linux下fork创建子进程复制父进程内存空间写时复制COW。fork瞬间子进程和父进程内存一模一样子进程修改内存才会单独分配物理内存。写时复制COW进程层面fork出来的worker一开始和master共享物理内存。当worker执行代码、修改变量操作系统才拷贝对应的内存页分配独立物理内存。这是FPM节省内存的关键。请求生命周期单次HTTP请求worker进程空间复用接收请求 → 在本进程空间内执行脚本分配堆内存创建对象 → 请求结束PHP释放本次请求堆内存进程本身不销毁进程空间保留等待下一个请求。pm进程管理模式FPMstatic固定数量workerdynamic动态增减workerondemand有请求才创建worker所有worker各自独立进程空间。进程重启 recycleFPM配置pm.max_requestsworker处理N次请求之后自动退出销毁进程空间master重新fork新worker。目的清理长期运行累积的内存碎片、隐性内存泄漏。四、进程空间内PHP运行时相关术语内存池PHP own memory pool在进程的堆里面PHP内核自建内存池。不每次直接调用系统malloc从内存池分配小块内存请求结束批量回收减少系统调用开销。memory_limit限制当前PHP进程空间中PHP脚本可使用的内存上限不是整个进程全部内存。达到限制抛出内存耗尽致命错误。全局符号表保存在全局数据段。存放类定义、全局函数、常量。一旦类加载到进程在这个worker进程生命周期内一直存在不会随单次请求结束销毁。重点FPM worker处理下一个请求类定义还在内存不需要重新解析文件这就是opcache的基础。OPcache把PHP脚本编译后的opcode字节码缓存放在进程共享内存避免重复解析编译PHP源码。属于进程间共享内存不属于单个进程私有堆。共享内存 shm一块特殊内存可以跨多个进程访问。Redis、IPC通信会用到不属于某一个进程私有地址空间。五、进程间通信 IPCIPC Inter-Process Communication进程之间互相交换数据的方式。进程空间隔离不能直接读写对方内存必须走IPC。管道pipe、消息队列、socket、shm共享内存PHP多进程程序用来交换信息的IPC手段。FPM worker之间默认不通信。六、进程空间 vs 线程空间区分重点进程独立完整地址空间进程崩溃互不影响开销大。线程轻量级进程一个进程内部可以开启多个线程所有线程共用同一份进程地址空间。线程之间共享堆、全局数据一个线程崩溃整个进程直接挂掉。PHP-FPM是多进程模型不是多线程Swoole可以选择多线程模式。七、高频误区术语面试高频误区每次HTTP请求都会新建一个PHP进程纠正FPM worker进程是复用的。进程只创建一次反复处理多次请求进程空间持续存在。直到达到max_requests才销毁重建。误区不同FPM worker之间可以直接访问对方的对象变量纠正进程空间隔离。worker1堆里的对象worker2完全看不到。误区类定义每次请求都会重新加载纠正worker进程加载类后类定义保存在进程全局段请求结束不销毁opcache进一步缓存字节码。误区memory_limit限制服务器整机内存纠正memory_limit是单个PHP进程的内存上限不是整机。10个worker每个限制128M最大理论占用10*128M。误区fork之后父子进程内存完全独立纠正fork采用写时复制创建瞬间共享物理内存修改才拷贝。误区堆内存属于操作系统不属于进程空间纠正堆是进程虚拟地址空间的一个分区属于进程私有。八、人生符号类比一个PHP进程空间就是一个独立的心智世界。每个世界有自己的仓库堆、临时工作台栈、固定规则模板代码段、全局类定义。多个心智世界互相隔离不能直接偷看对方内部数据fork相当于复制一份心智副本副本不改东西就共用底层素材一旦修改就分出独立版本每次请求只是在这个心智世界里面做一次任务任务做完清空临时物品但心智世界本身不会直接拆掉。庖丁解牛一句话总结PHP进程空间是操作系统分配给PHP进程的独立虚拟地址空间分为代码段、全局段、堆、栈FPM多进程模型每个worker拥有独立进程空间天然内存隔离fork使用写时复制减少内存开销worker进程会复用进程空间长期存活单次请求结束只会释放本次业务堆内存类定义保留在全局段进程间不能直接互访内存通信依靠IPC进程和线程核心差别在于是否共享同一份地址空间。