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 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
Smarty+QUICKFORM小小演示
Feb 25 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
Mar 21 PHP
PHP生成UTF8文件的方法
May 15 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
PHP explode()函数用法、切分字符串
Oct 03 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
Mar 15 PHP
php curl批处理实现可控并发异步操作示例
May 09 PHP
YII框架行为behaviors用法示例
Apr 26 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源码之 ext/mysql扩展部分
2009/07/17 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
Python语法分析之字符串格式化
2019/06/13 Python
python+logging+yaml实现日志分割
2019/07/22 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
劳资员岗位职责
2013/11/11 职场文书
cf收人广告词大全
2014/03/14 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
客房服务员岗位职责
2015/02/09 职场文书
研究生导师推荐信
2015/03/25 职场文书
刑事案件上诉状
2015/05/23 职场文书
乱世佳人观后感
2015/06/08 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript