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 相关文章推荐
phpBB BBcode处理的漏洞
Oct 09 PHP
MYSQL环境变量设置方法
Jan 15 PHP
php 连接mssql数据库 初学php笔记
Mar 01 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
PHP中each与list用法分析
Jan 08 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
php版银联支付接口开发简明教程
Oct 14 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
Jun 30 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
phpfpm的作用和用法
Oct 10 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
Memcached常用命令以及使用说明详解
2013/06/27 PHP
php数组去重实例及分析
2013/11/26 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
web 页面分页打印的实现
2009/06/22 Javascript
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
大学生农村教师实习自我鉴定
2013/09/21 职场文书
个人简历自我评价范文
2014/02/04 职场文书
运动会稿件50字
2014/02/17 职场文书
安全标准化实施方案
2014/02/20 职场文书
体育教学随笔感言
2014/02/24 职场文书
爱国影片观后感
2015/06/18 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript