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安全配置
Oct 09 PHP
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php实现在线生成条形码示例分享(条形码生成器)
Dec 30 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
Aug 17 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中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
jquery中动态效果小结
2010/12/16 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
第三章之Bootstrap 表格与按钮功能
2016/04/25 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
简单解决Python文件中文编码问题
2015/11/22 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python利用faker库批量生成测试数据
2020/10/15 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
造价工程师个人求职信
2013/09/21 职场文书
学校门卫管理制度
2014/01/30 职场文书
关于环保的建议书400字
2014/03/12 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
政协工作总结2015
2015/05/20 职场文书
汽车车尾标语大全
2015/08/11 职场文书
XX部保密工作制度范本
2019/08/27 职场文书