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 学习资料零碎东西
Dec 04 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
php获取远程文件的内容和大小
Nov 03 PHP
php多线程并发实现方法
Sep 30 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
php常用正则函数实例小结
Dec 29 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
php通过各种函数判断0和空
Jul 04 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函数
2010/02/16 PHP
php URL验证正则表达式
2011/07/19 PHP
php二分查找二种实现示例
2014/03/12 PHP
PHP中使用GD库创建圆形饼图的例子
2014/11/19 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
js 居中漂浮广告
2010/03/21 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
vue Render中slots的使用的实例代码
2017/07/19 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Django实现图片文字同时提交的方法
2015/05/26 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
Python编写Windows Service服务程序
2018/01/04 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
农药学硕士毕业生自荐信
2013/09/25 职场文书
班组长安全职责
2014/01/05 职场文书
英语国培研修感言
2014/02/13 职场文书
妇联领导班子剖析材料
2014/08/21 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
卫生主题班会
2015/08/14 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python