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绝对路径与相对路径之间关系的的分析
Mar 03 PHP
php实现监听事件
Nov 06 PHP
php写的AES加密解密类分享
Jun 20 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
Thinkphp关闭缓存的方法
Jun 26 PHP
php使用正则验证中文
Apr 06 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
Jan 26 PHP
PHP数组基本用法与知识点总结
Jun 02 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
cache_lite试用
2007/02/14 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
js实现touch移动触屏滑动事件
2015/04/17 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
基于zepto的移动端轻量级日期插件--date_picker
2016/03/04 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
详解 Python 读写XML文件的实例
2017/08/02 Python
python实现感知器算法详解
2017/12/19 Python
Python中static相关知识小结
2018/01/02 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Flask框架通过Flask_login实现用户登录功能示例
2018/07/17 Python
Flask框架配置与调试操作示例
2018/07/23 Python
python机器学习之KNN分类算法
2018/08/29 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
工作简报范文
2015/07/21 职场文书