PHP多进程API

创建子进程

@params void
@returns int
int pcntl_fork(void)
成功时,在父进程执行线程内返回产生的子进程PID,在子进程执行线程内返回0,失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个php错误

获取当前进程id

@params void
@returns int
int posix_getpid(void)
返回进程id,类型为整型

父进程等待子进程退出

@params $status
@params $option
@return bool
int pcntl_wait(int &$status[,int $options=0])
该函数等同于以-1作为参数pid的值并且没有options参数来调用pcntl_waitpid()的函数

进程退出状态

@params $status
@return bool
bool pcntl_wifexited(int $status)

进程退出码

@params $status
@return int
int pcntl_wexitstatus(int $status)

简单PHP多进程示例

function process_execute($input) {
$pid = pcntl_fork(); //创建子进程
if ($pid == 0) {//子进程
$pid = posix_getpid();
echo "* Process {$pid} was created, and Executed:\n\n";
eval($input); //解析命令
exit;
} else {//主进程
$pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
if (pcntl_wifexited($status)) {
echo "\n\n* Sub process: {$pid} exited with {$status}";
}
}

通过调用php创建子进程接口完成一个子进程的创建,pcntl_fork返回值为0证明进入到子进程内,非0则进入到父进程内部,-1则父进程创建子进程失败。

多个子进程初级版本示例

foreach ($clusterList as $key=>$value) {
$pid = pcntl_fork();//创建子进程
if($pid == 0) {//子进程
//do something
} else if($pid == -1) {
//fork error occured
} else {
pcntl_wait($status);
} }

该实现方式主要逻辑为循环创建一个子进程,并且父进程等待子进程完成退出后,再继续创建下一个子进程

缺点:无法真正体现多进程,实际上时串行的创建子进程

多个子进程优化版本示例

foreach ($clusterList as $key=>$value) {
$pid = pcntl_fork();//创建子进程
if($pid == 0) {//子进程
//do something
} else if($pid == -1) {
return false;
}
}
for (;;) {
$ret = pcntl_waitpid(-1,$status,WNOHANG);
if ($ret == -1) {
// error occured
} else if ($ret == 0) {
//all child are existed
break;
} else {
//check sub process exit status
$extFlag = pcntl_wifexited($status);
if(!$extFlag){
//exited unnormally
}else {
$extCode = pcntl_wexitstatus($status);
//exited normally
}
}
}

该逻辑通过for循环不断获取子进程的退出状态,直到所有的子进程都退出,真正实现多进程处理。

最新文章

  1. split分割大文件--包含通过awk按规则分割文件到对应子文件
  2. Bootstrap<基础九>辅助类
  3. 关于Js添加版本号
  4. 取消 virtualStore 注册表[启用和禁止 UAC虚拟化]
  5. MYSQL主从数据库搭建
  6. 一个例子深入理解ClassLoader
  7. null类型的字段加1
  8. Linux下gcc编译生成动态链接库*.so文件并调用它【转载】
  9. 转:JMeter--使用代理录制Web性.能测试脚.本
  10. Boost库安装(实测vs2012)
  11. httpclient的理解(代码理解)
  12. 配置python3
  13. Android为TV端助力 handler传递消息机制
  14. 联想G510安装win7系统
  15. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
  16. 这个不是第一次作业----艰难的安装Android studio历程
  17. 【leetcode 简单】 第七十五题 第一个错误的版本
  18. 团体队列(UVa540)
  19. C#中汉字排序简单示例(拼音/笔划)
  20. TypeScript学习笔记(六) - 模块

热门文章

  1. sql:Mysql create view,function,procedure
  2. CSS中的onmouseover和hover有什么区别
  3. react与vue
  4. 自定义View和ViewGroup(有这一篇就够了)
  5. 一步一步pwn路由器之环境搭建
  6. 微信小程序-04-详解介绍.json 配置文件
  7. [2014年学习计划之RoR系列] 第二步 – 熟悉Ruby语言 (2/n) Blocks and Iterators (代码块和迭代器)
  8. 通过注解实现Spring 声明式事务管理
  9. 使用@Value进行静态常量的值注入
  10. 记作为前端开发人员跑去面试C#.NET