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
php后退一页表单内容保存实现方法
Jun 17 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
php顺序查找和二分查找示例
Mar 27 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
Feb 12 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
php实现将二维关联数组转换成字符串的方法详解
Jul 31 PHP
php mysql PDO 查询操作的实例详解
Sep 23 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php函数serialize()与unserialize()用法实例
2014/11/06 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
详解vue组件基础
2018/05/04 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
探究一道价值25k的蚂蚁金服异步串行面试题
2020/08/21 Javascript
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
大学毕业生简单自荐信
2013/11/05 职场文书
学校七一活动方案
2014/01/19 职场文书
文明城市创建标语
2014/06/16 职场文书
大学生工作自荐书
2014/06/16 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
党支部综合考察意见
2015/06/01 职场文书