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 相关文章推荐
15个小时----从修改程序到自己些程序
Oct 09 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
php模板原理讲解
Nov 13 PHP
php控制文件下载速度的方法
Mar 24 PHP
PHP模板引擎Smarty内建函数详解
Apr 11 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 PHP
php socket通信简单实现
Nov 18 PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 PHP
PHP从尾到头打印链表实例讲解
Sep 27 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
laravel多条件查询方法(and,or嵌套查询)
Oct 09 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
php进程间通讯实例分析
2016/07/11 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
python基础教程之缩进介绍
2014/08/29 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
进程的查看和调度分别使用什么命令
2013/12/14 面试题
迎新晚会邀请函
2014/02/01 职场文书
副董事长岗位职责
2014/04/02 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
片区教研活动总结
2014/07/02 职场文书
标准单位租车协议书
2014/09/23 职场文书
业务内勤岗位职责
2015/04/13 职场文书
大学生逃课检讨书
2015/05/04 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫