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 相关文章推荐
在WINDOWS中设置计划任务执行PHP文件的方法
Dec 19 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
php中get_object_vars()方法用法实例
Feb 08 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
PHP异常处理Exception类
Dec 11 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 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入门速成教程
2007/03/19 PHP
PHP 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
用js实现手把手教你月入万刀(转贴)
2007/11/07 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
详解javascript高级定时器
2015/12/31 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python Grid使用和布局详解
2018/06/30 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
关于抽烟的检讨书
2014/02/25 职场文书
建议书的格式
2014/05/12 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
滞留工资返还协议书
2014/10/19 职场文书
党员转正意见怎么写
2015/06/03 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python