PHP多进程[1] pcntl扩展

PHP多进程[1] pcntl扩展

这是2020小目标20篇技术Blog的第 2 篇
距离小目标还有 18 篇✍️
@LiKachung

简介

PHP的进程控制支持实现了Unix方式的进程创建 程序执行 信号处理以及进程的中断
PCNTL现在使用了ticks作为信号处理的回调机制 ticks在速度上远远超过了之前的处理机制
您可以使用declare() 语句在程序中指定允许发生回调的位置
这使得我们对异步事件处理的开销最小化

在编译PHP时 启用pcntl将始终承担这种开销 不论您的脚本中是否真正使用了pcntl

PHP多进程不支持PHP-FPM和CGI模式 只能通过CLI模式
并且不支持在window环境运行



启动扩展

pcntl扩展不需要在php.ini中定义配置指令 默认存在但不启动

1
2
3
4
5
6
7
8
9
10
11
12
13
# 先检查是否存在扩展
# 第一种检查方式
php -m | grep pcntl

# 第二种检查方式 查看php编译参数
php -i | grep '\-\-enable-pcntl'

# 第三种检查方式 查看扩展信息
php --ri pcntl | grep enabled

# 若无输出 则扩展未启动 重新编译安装php 添加编译参数
# 一键获取原先的编译参数 复制后在命令最后隔个空格后 添加--enable-pcntl
php -i | grep configure | awk -F 'Configure Command => ' '{print $2}' | sed $'s/\'//g'

常用方法

pcntl_fork ( void ) : int

简介

函数创建一个子进程
这个子进程仅PID(进程号) 和PPID(父进程号)与其父进程不同

Return

success =>

  • 在父进程执行线程内返回产生的子进程的PID
  • 在子进程执行线程内返回0


failed =>
在父进程上下文返回-1 不会创建子进程 并且会引发一个PHP错误

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls = true ] ) : bool

简介

函数pcntl_signal()为signo指定的信号安装一个新的信号处理器

参数

signo 信号编号
handler 信号处理器可以是用户创建的函数或方法的名字 也可以是系统常量 SIG_IGN(忽略信号处理程序)或 SIG_DFL(默认信号处理程序)
restart_syscalls 指定当信号到达时系统调用重启是否可用 (官方手册指明存在bug 参数无效)

Return

True / False


pcntl_signal_dispatch ( void ) : bool

简介

函数pcntl_signal_dispatch()调用每个等待信号通过pcntl_signal() 安装的处理器

Return

True / False

pcntl_wait ( int &$status [, int $options = 0 ] ) : int

简介

暂停当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数
如果一个子进程在调用此函数时已经退出(俗称僵尸进程)此函数立刻返回
子进程使用的所有系统资源将被释放

该方法等同于以_-1_作为参数pid的值并且没有options参数来调用pcntl_waitpid()函数

参数

status 存储状态信息到status参数 通过status参数返回的状态信息可以用以下函数获取其具体的值pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig(), pcntl_wstopsig()
options 如果您的操作系统(多数BSD类系统)允许使用wait3 您可以提供可选的options 参数
如果这个参数没有提供 wait将会被用作系统调用
如果wait3不可用 提供参数 options不会有任何效果

Note

options的值可以是0 或者以下两个常量或两个常量“或运算”结果(即两个常量代表意义都有效)

WNOHANG 如果没有子进程退出立刻返回
WUNTRACED 子进程已经退出并且其状态未报告时返回

Return

返回退出的子进程进程号 发生错误时返回-1
如果提供了 WNOHANG 作为option(wait3可用的系统)并且没有可用子进程时返回0

更多

点击移步官方文档

# PHP

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×