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中的数组操作函数整理
Aug 18 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
CI框架自动加载session出现报错的解决办法
Jun 17 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
Mar 07 PHP
PHP7正式版测试,性能惊艳!
Dec 08 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
分享php多功能图片处理类
May 15 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
PHP架构及原理知识点详解
Dec 22 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
第十三节--对象串行化
2006/11/16 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
2011/11/03 PHP
一个基于phpQuery的php通用采集类分享
2014/04/09 PHP
php字符串过滤与替换小结
2015/01/26 PHP
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
python打包成so文件过程解析
2019/09/28 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
python 监控logcat关键字功能
2020/09/04 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
警校毕业生自我评价
2014/04/06 职场文书
应聘英语教师求职信
2014/04/24 职场文书
旅游文化节策划方案
2014/06/06 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
企业财务管理制度范本
2015/08/04 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技