紫影基地

 找回密码
 立即注册
查看: 147|回复: 0

[PHP] PHP多进程 - pcntl扩展

[复制链接]
阅读字号:

2002

主题

2117

帖子

21万

积分

超级版主

Rank: 8Rank: 8

积分
210303
发表于 2024-4-9 09:27:17 | 显示全部楼层 |阅读模式
PHP多进程 - pcntl扩展
时间:2020-08-08 09:14来源:我爱学习网 作者:apple

PHP的进程控制支持实现了Unix方式的进程创建 程序执行 信号处理以及进程的中断

PCNTL现在使用了ticks作为信号处理的回调机制 ticks在速度上远远超过了之前的处理机制

您可以使用declare() 语句在程序中指定允许发生回调的位置

这使得我们对异步事件处理的开销最小化



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



PHP多进程不支持PHP-FPM和CGI模式 只能通过CLI模式

并且不支持在window环境运行



<!-- more -->




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

# 先检查是否存在扩展
# 第一种检查方式
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


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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫影基地

GMT+8, 2025-1-12 11:56 , Processed in 0.083441 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表