PHP多进程编程实例详解


Posted in PHP onJuly 19, 2017

本文实例讲述了PHP多进程编程。分享给大家供大家参考,具体如下:

第一步:

$ php -m  命令查看php是否安装pcntl 和 posix扩展,若没有则安装

使用场景:

1. 要进行大量的网络耗时的操作
2. 要做大量的运算,并且,系统有多个cpu,为了让用户有更快的体验,把一个任务,分成几个小任务,最后合并。

多进程常用函数:

pcntl_alarm — 为进程设置一个alarm闹钟信号
pcntl_errno — 别名 pcntl_strerror
pcntl_exec — 在当前进程空间执行指定程序
pcntl_fork — 创建子进程,在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。
pcntl_get_last_error — Retrieve the error number set by the last pcntl function which failed
pcntl_getpriority — 获取任意进程的优先级
pcntl_setpriority — 修改任意进程的优先级
pcntl_signal_dispatch — 调用等待信号的处理器
pcntl_signal — 安装一个信号处理器
pcntl_sigprocmask — 设置或检索阻塞信号
pcntl_sigtimedwait — 带超时机制的信号等待
pcntl_sigwaitinfo — 等待信号
pcntl_strerror — Retrieve the system error message associated with the given errno
pcntl_wait — 等待或返回fork的子进程状态
pcntl_waitpid — 等待或返回fork的子进程状态
pcntl_wexitstatus — 返回一个中断的子进程的返回代码
pcntl_wifexited — 检查状态代码是否代表一个正常的退出。
pcntl_wifsignaled — 检查子进程状态码是否代表由于某个信号而中断
pcntl_wifstopped — 检查子进程当前是否已经停止
pcntl_wstopsig — 返回导致子进程停止的信号
pcntl_wtermsig — 返回导致子进程中断的信号

实例一:

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo '原始父进程:' . $parentPid . PHP_EOL;
//创建子进程,返回子进程id
$pid = pcntl_fork();
if( $pid == -1 ){
  exit("fork error");
}
//pcntl_fork 后,父进程返回子进程id,子进程返回0
echo 'ID : ' . $pid . PHP_EOL;
if( $pid == 0 ){
  //子进程执行pcntl_fork的时候,pid总是0,并且不会再fork出新的进程
  $mypid = getmypid(); // 用getmypid()函数获取当前进程的PID
  echo 'I am child process. My PID is ' . $mypid . ' and my fathers PID is ' . $parentPid . PHP_EOL;
} else {
  //父进程fork之后,返回的就是子进程的pid号,pid不为0
  echo 'Oh my god! I am a father now! My childs PID is ' . $pid . ' and mine is ' . $parentPid . PHP_EOL;
}
$aa = shell_exec("ps -af | grep index.php");
echo $aa;

实例二:开多个子进程,避免fork泛滥

<?php
//最早的进程,也是父进程
$parentPid = getmypid();
echo '原始父进程:' . $parentPid . PHP_EOL;
//开启十个子进程
for($i = 0; $i < 10; $i++) {
  $pid = pcntl_fork();
  if($pid == -1) {
    echo "Could not fork!\n";
    exit(1);
  }
  //子进程
  if(!$pid) {
    //child process workspace
    echo '子进程:' . getmypid() . PHP_EOL;
    exit(); //子进程逻辑执行完后,马上退出,以免往下走再fork子进程,不好控制  
  } else {
    echo '父进程:' . getmypid() . PHP_EOL;
  }
}
echo getmypid() . PHP_EOL;
$aa = shell_exec("ps -af | grep index.php");
echo $aa;

注意:

通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 静态页面中显示动态内容
Aug 14 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
yii框架配置默认controller和action示例
Apr 30 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP session文件独占锁引起阻塞问题解决方法
May 12 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
php实现二叉树中和为某一值的路径方法
Oct 14 PHP
PHP crc32()函数讲解
Feb 14 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 #PHP
php实现生成code128条形码的方法详解
Jul 19 #PHP
php-beanstalkd消息队列类实例分享
Jul 19 #PHP
php+ajax实现异步上传文件或图片功能
Jul 18 #PHP
Joomla框架实现字符串截取的方法示例
Jul 18 #PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 #PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 #PHP
You might like
关于初学PHP时的知识积累总结
2013/06/07 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
php排序算法实例分析
2016/10/17 PHP
php判断目录存在的简单方法
2019/09/26 PHP
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
简单实现JS上传图片预览功能
2017/04/14 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
微信小程序实现换肤功能
2018/03/14 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
python ansible服务及剧本编写
2017/12/29 Python
给Django Admin添加验证码和多次登录尝试限制的实现
2020/07/26 Python
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
房地产营销策划方案
2014/02/08 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
科技活动周标语
2014/10/08 职场文书
2014年班干部工作总结
2014/11/25 职场文书
大学生创业事迹材料
2014/12/30 职场文书
护士先进个人总结
2015/02/13 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
早安问候语大全
2015/11/10 职场文书
Jupyter notebook 更改文件打开的默认路径操作
2021/05/21 Python
MongoDB数据库之添删改查
2022/04/26 MongoDB
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL