[2020年面试题-PHP 与 golang] 2. PHP 那既然是多进程,那怎么共享数据?
原问答文链接#
分享:[分享] 大环境下瑟瑟发抖辞职的第二天,拿了两个 offer
面试题解析#
- 你刚刚说到 PHP 那既然是多进程,那怎么共享数据?
答:PHP 既然是多进程,进程资源的地址和 PCB 空间都是独立的,没办法共享数据吧。
ps:此答案为摘抄自该面试者的回答。并不代表标准与正确答案。技术是一个探讨的过程,我们做的是探讨与总结。
解析回答:PHP 既然是多进程,进程资源的地址和 PCB 空间都是独立的,没办法共享数据吧。#
1. 首先:进程通信是什么?#
进程通信是指在进程间传输数据 (交换信息)。^ [1]^ 进程通信根据交换信息量的多少和效率的高低,分为低级通信(只能传递状态和整数值)和高级通信(提高信号通信的效率,传递大量数据,减轻程序编制的复杂度)。其中高级进程通信分为三种方式:共享内存模式、消息传递模式、共享文件模式。
2. 进程间的五种通信方式介绍#
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
IPC 的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams 等。其中 Socket 和 Streams 支持不同主机上的两个进程 IPC。
以 Linux 中的 C 语言编程为例。
3. 其次, 原生 php,没有支持进程通信的手段#
4. 借助 swoole 完成进程通信#
Swoole 进程间通信的方式
首先需要了解管道的概念。
4.1 管道的概念:#
管道是一种最基本的 IPC【Inter-Process Communication,进程间通信】机制,作用于有血缘关系的进程之间,完成数据传递。调用 pipe 系统函数即可创建一个管道。有如下特质:
其本质是一个伪文件 (实为内核缓冲区)
由两个文件描述符引用,一个表示读端,一个表示写端。
规定数据从管道的写端流入管道,从读端流出。
管道的原理:管道实为内核使用环形队列机制,借助内核缓冲区 (4k) 实现。
管道的局限性:
① 数据自己读不能自己写。
② 数据一旦被读走,便不在管道中存在,不可反复读取。
③ 由于管道采用半双工通信方式。因此,数据只能在一个方向上流动。
④ 只能在有公共祖先的进程间使用管道。
常见的通信方式有,单工通信、半双工通信、全双工通信。
4.2 管道 pipe 与其两种类型#
管道用于进程之间的数据交互,Linux 系统本身提供了 pipe 函数用于创建一个半双工通信管道。半双工的通信方式中数据只能单向流动(一端只读一端只写),只能在具有亲缘关系(父子进程)的进程之间使用。
管道是进程间通信 IPC 中最基础的方式,管道有两种类型分别是命名管道
、匿名管道
。
匿名管道
:专门用于具有血缘关系的进程之间,完成数据传递。命名管道
:可以用在任何两个进程之间,Swoole 中的管道都是匿名管道。
在 Swoole 中利用 eventfd 和 UnixSock 封装了两种管道,使得进程之间的通信更加灵活。
Swoole 的 Process 模块内置了管道的方式用于进程间通信,在构建 Process 实例时只要开启了 $pipe_type 选项,Swoole 底层会自动创建一个管道,这里需要说明的时,虽然名字上叫做管道,但实际上在新版 Swoole 中底层通信是通过 UnixSock 实现的,所以并不是真正意义上的 Linux Pipe。
5. swoole 中管道通信例子#
创建进程
管道类型 $pipe_type 可分为三种:
0 表示不创建管道
1 表示创建 SOCK_STREAM 类型的管道
2 表示创建 SOCK_DGRAM 类型的管道
当启用 $redirect_stdin_stdout 后,$pipe_type 选项将忽略用户参数,强制为 1。
管道描述符
当进程被 fork 出来后,父进程和子进程中的 Process 对象会被设置上一个名为 pipe 的成员变量,存放着底层 UnixSocket 的描述符,父进程和子进程可以通过这个管道描述符来发送数据,也可以直接调用 Process 提供的 read/write 接口来收发数据。
管道读写
swoole_process->write(string $data)
向进程的管道中写入数据
swoole_process->read(int $buffer_size = 8192)
从进程的管道中读取数据
此处 swoole 间进程通信原文:
www.cnblogs.com/heyue0117/p/119737...
防爬虫说明#
禁止 学习某地爬虫,知乎爬虫,CSDN 爬虫。
本文,首发在 learnku 社区。
@author
汪春波(www.shxdledu.cn)
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: