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脚本的10个技巧(4)
Oct 09 PHP
PHP 数字左侧自动补0
Mar 31 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
ThinkPHP3.1基础知识快速入门
Jun 19 PHP
写一段简单的PHP建立文件夹代码
Jan 06 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
PHP中的事务使用实例
May 26 PHP
PHP扩展Memcache分布式部署方案
Dec 06 PHP
php实现的http请求封装示例
Nov 08 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 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
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
php中文字符截取防乱码
2008/03/28 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
基本DOM节点操作
2017/01/17 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
js中变量的连续赋值(实例讲解)
2017/07/08 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
python字符串,数值计算
2016/10/05 Python
python里使用正则的findall函数的实例详解
2017/10/19 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python代码太长换行的实现
2019/07/05 Python
django实现支付宝支付实例讲解
2019/10/17 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python3正则模块re的使用方法详解
2020/02/11 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
python 递归相关知识总结
2021/03/03 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
国际奢侈品品牌童装购物网站:Designer Childrenswear
2019/05/08 全球购物
小学生自我评价范例
2013/09/24 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
名人传读书笔记
2015/06/26 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP