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,ajax实现分页
Mar 27 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
Nov 05 PHP
php数组查找函数总结
Nov 18 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
PHP抓取远程图片(含不带后缀的)教程详解
Oct 21 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
Feb 04 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
Feb 15 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 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
点评山进PR-D3L三波段收音机
2021/03/02 无线电
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
[04:29]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/02/01 DOTA
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
Python探索之修改Python搜索路径
2017/10/25 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
Python脚本实现监听服务器的思路代码详解
2020/05/28 Python
python exit出错原因整理
2020/08/31 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
详解通过变换矩阵实现canvas的缩放功能
2019/01/14 HTML / CSS
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
附答案的Java面试题
2012/11/19 面试题
担保书范本
2015/01/20 职场文书
订货会主持词
2015/07/01 职场文书
2016年母亲节广告语
2016/01/28 职场文书