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语法(1)
Oct 09 PHP
如何将一个表单同时提交到两个地方处理
Oct 09 PHP
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
Apr 22 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
Feb 08 PHP
Laravel框架实现的rbac权限管理操作示例
Jan 16 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 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 常用字符串函数总结
2008/03/15 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
2015/05/13 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
jQuery之end()和pushStack()使用介绍
2012/02/07 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
webpack proxy 使用(代理的使用)
2020/01/10 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python实现的一个火车票转让信息采集器
2014/07/09 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
python实现转圈打印矩阵
2019/03/02 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
python基于openpyxl生成excel文件
2020/12/23 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
财务会计专业毕业生自荐信
2013/10/02 职场文书
《雷雨》教学反思
2014/02/20 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
公司放假通知怎么写
2015/04/15 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
python三子棋游戏
2022/05/04 Python