位置: 编程技术 - 正文

PHP多进程编程总结(推荐)(php多进程处理大数据)

编辑:rootadmin

推荐整理分享PHP多进程编程总结(推荐)(php多进程处理大数据),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php多进程写入文件,php多进程处理大数据,php进程数量怎么决定,php多进程写入文件,php 多进程 多线程,php多进程写入文件,php多进程编程总结怎么写,php多进程编程总结怎么写,内容如对您有帮助,希望把文章链接给更多的朋友!

1. 准备

在动手之前,请确定你用的不是M$ Windows平台(因为我没有Windows)。Linux / BSD / Unix应该都是没问题的。确认好了工作环境以后一起来看看我们需要的PHP模块是否都有。打开终端输入下面的命令:

$ php -m

这个命令检查并打印当前PHP所有开启的扩展,看一下pcntl和posix是否在输出的列表中。

1.1. pcntl

如果找不到pcntl,八成是编译的时候没把这个扩展编译进去。如果你和我一样是编译安装的PHP,那么需要重新编译安装PHP。在配置的时候记得加上--enable-pcntl参数即可。

1.2. posix

这货一般默认就会装上,只要你编译的时候没有加上--disable-posix。

2. 预备知识

在继续之前,你还需要对Linux多进程有一点了解。多进程是咋回事呢?这里可跟火影忍者里的影分身稍微有点不同。首先,鸣人从小长到大,比如岁,咳。有一天他发动了影分身,分出了5个他。显然,这些分身也是岁的鸣人而不是刚出生啥也不懂就会哭的婴儿(那叫克隆)。然后,不一样的地方来了:分身们变成了独立的人各自去做各自的事,互相之间不再知道其他分身和原身都做了什么(当然不会像动画片里一样积累经验给原身啦)。除非,他们互相之间有交流,不然,只有岁之前的事情才是他们共同的记忆。

有同学说了,老大你这不坑爹呢么?我又没看过火影忍者!那你去看一遍好了……

最后,预备知识完了,就是大致了解一下主进程开出来的子进程是怎么回事。子进程的代码和主进程是完全一样的,还有一部分一样的东西就是直到发动影分身之前执行的所有内容。具体请参见《操作系统》课程。

3. 影分身之术

所以呢,没有点基础知识怎么能理解卷轴里的内容呢?打开卷轴首先看到了一个单词:fork。

3.1. fork

叉子?叉子是分岔的,一个变多个嘛!差不多就是这个意思。创建子进程就用这个命令。这里需要用到pcntl_fork()函数。(可以先简单看一下PHP手册关于这个函数的介绍。)创建一个PHP脚本:

pcntl_fork()函数创建一个子进程,子进程和父进程唯一的区别就是PID(进程ID)和PPID(父进程ID)不同。在终端下查看进程用ps命令(问问man看ps怎么用:man ps)。当函数返回值为-1的时候,说明fork失败了。试试在if前面加一句:echo $pid . PHP_EOL;。运行你的脚本,输出可能像下面这样(结果说明子进程和父进程的代码是相同的):

pcntl_fork()函数调用成功后,在父进程中会返回子进程的PID,而在子进程中返回的是0。所以,下面直接用if分支来控制父进程和子进程做不同的事。

3.2. 分配任务

然后我们来说说鸣人岁那次影分身的事儿,给原身和分身分配两个简单的输出任务:

输出的结果可能是这样:

再强调一下,pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的$pid变量值是0,它是子进程;另一个程序得到的$pid的值大于0,这个值是子进程的PID,它是父进程。在下面的分支语句中,由于$pid值的不同,运行了不同的代码。再次强调一下:子进程的代码和父进程的是一样的。所以就要通过分支语句给他们分配不同的任务。

3.3. 子进程回收

刚刚有man ps么?一般我习惯用ps aux加上grep命令来查找运行着的后台进程。其中有一列STAT,标识了每个进程的运行状态。这里,我们关注状态Z:僵尸(Zombie)。当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。Oops,又跟火影里的影分身不一样了。鸣人的影分身被干死了以后就自动消失了,但是这里的子进程分身死了话还留着一个空壳在,直到父进程回收它。僵尸进程虽然不占什么内存,但是很碍眼,院子里一堆躺着的僵尸怎么都觉得怪怪的。(别忘了它们还占用着PID)

一般来说,在父进程结束之前回收挂掉的子进程就可以了。在pcntl扩展里面有一个pcntl_wait()函数,它会将父进程挂起,直到有一个子进程退出为止。如果有一个子进程变成了僵尸的话,它会立即返回。所有的子进程都要回收,所以多等等也没关系啦!

PHP多进程编程总结(推荐)(php多进程处理大数据)

3.4. 父进程先挂了

如果父进程先挂了怎么办?会发生什么?什么也不会发生,子进程依旧还在运行。但是这个时候,子进程会被交给1号进程,1号进程成为了这些子进程的继父。1号进程会很好地处理这些进程的资源,当它们结束时1号进程会自动回收资源。所以,另一种处理僵尸进程的临时办法是关闭它们的父进程。

4. 信号

一般多进程的事儿讲到上面就完了,可是信号在系统中确实是一个非常重要的东西。信号就是信号灯,点亮一个信号灯,程序就会做出反应。这个你一定用过,比如说在终端下运行某个程序,等了半天也没什么反应,可能你会按 Ctrl+C 来关闭这个程序。实际上,这里就是通过键盘向程序发送了一个中断的信号:SIGINT。有时候进程失去响应了还会执行kill [PID]命令,未加任何其他参数的话,程序会接收到一个SIGTERM信号。程序收到上面两个信号的时候,默认都会结束执行,那么是否有可能改变这种默认行为呢?必须能啊!

4.1. 注册信号

人是活的程序也是活的,只不过程序需要遵循人制定的规则来运行。现在开始给信号重新设定规则,这里用到的函数是pcntl_signal()(继续之前为啥不先查查PHP手册呢?)。下面这段程序将给SIGINT重新定义行为,注意看好:

执行一下,随时按下 Ctrl+C 看看会发生什么事。

4.2. 信号分发

说明一下:pcntl_signal()函数仅仅是注册信号和它的处理方法,真正接收到信号并调用其处理方法的是pcntl_signal_dispatch()函数。试试把// do something替换成下面这段代码:

在终端下执行这个脚本,当它不停输出数字的时候尝试按下 Ctrl+C 。看看程序有什么响应?嗯……什么都没有,除了屏幕可能多了个^C以外,程序一直在不停地输出数字。因为程序一直没有执行到pcntl_signal_dispatch(),所以就并没有调用signalHandler(),所以就没有输出signal received。

4.3. 版本问题

如果认真看了PHP文档,会发现pcntl_signal_dispatch()这个函数是PHP 5.3以上才支持的,如果你的PHP版本大于5.3,建议使用这个方法调用信号处理器。5.3以下的版本需要在注册信号之前加一句:declare(ticks = 1);表示每执行一条低级指令,就检查一次信号,如果检测到注册的信号,就调用其信号处理器。想想就挺不爽的,干嘛一直都检查?还是在我们指定的地方检查一下就好。

4.4. 感受僵尸进程

现在我们回到子进程回收的问题上(差点忘了= =")。当你的一个子进程挂了(或者说是结束了),但是父进程还在运行中并且可能很长一段时间不会退出。一个僵尸进程从此站起来了!这时,保护伞公司(内核)发现它的地盘里出现了一个僵尸,这个僵尸是谁儿子呢?看一下PPID就知道了。然后,内核给PPID这个进程(也就是僵尸进程的父进程)发送一个信号:SIGCHLD。然后,你知道怎么在父进程中回收这个子进程了么?提示一下,用pcntl_wait()函数。

4.5. 发送信号

希望刚刚有认真man过kill命令。它其实就是向进程发送信号,在PHP中也可以调用posix_kill()函数来达到相同的效果。有了它就可以在父进程中控制其他子进程的运行了。比如在父进程结束之前关闭所有子进程,那么fork的时候在父进程记录所有子进程的PID,父进程结束之前依次给子进程发送结束信号即可。

5. 实践

PHP的多进程跟C还是挺像的,搞明白了以后用其他语言写的话也大同小异差不多都是这么个情况。如果有空的话,尝试写一个小程序,切身体会一下个中滋味:

1.岁的鸣人发送影分身,分出5个分身

2.每个分身随机生存到秒,每秒都输出点什么

3.保证原身能感受到分身的结束,然后开动另一个分身,保证最多有5个分身

4.不使用nohup,让原身在终端关闭后依旧能够运行

5.把分身数量(5)写进一个配置文件里,当给原身发送信号(可以考虑用SIGUSR1或SIGUSR2)时,原身读取配置文件并更新允许的分身最大数量

6.如果分身多了,关闭几个;如果少了,再分出来几个

提示:

1.用while循环保证进程运行,注意sleep以免%的CPU占用2.运行进程的终端被关闭时,程序会收到一个SIGHUP信号3.可以用parse_ini_file()函数解析INI配置文件

以上这篇PHP多进程编程总结(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

PHP的openssl加密扩展使用小结(推荐) 引言互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性

php 实现重定向跳转实例代码 在php中重定向实现方法很简单我们只要简单的利用header发送状态代码,然后再用header进行跳转,效果与apache,iis,nginx都是一样的效果哦。一:更推荐这

Yii2.0表关联查询实例分析 本文实例讲述了Yii2.0表关联查询的方法。分享给大家供大家参考,具体如下:你可以使用ActiveRecord来进行关联查询(比如,从A表读取数据时把关联的B表

标签: php多进程处理大数据

本文链接地址:https://www.jiuchutong.com/biancheng/301212.html 转载请保留说明!

上一篇:Yii2中cookie用法示例分析(cookie set)

下一篇:PHP的openssl加密扩展使用小结(推荐)(php7 openssl)

  • 企业税申报的三种方式
  • 小规模纳税人工程款税率是多少
  • 个体工商户税务申报一年几次
  • 委托收款和托收承付结算方式,都受结算金额起点的限制
  • 成立一般纳税人公司
  • 企业季度报什么税
  • 分期收款怎么做账
  • 公司从个人手中租房不能取得发票
  • 建筑类没收入怎么填
  • 联营扣点方案
  • 固定资产房屋原值增加折旧月数怎么算
  • 施工分包分为哪些
  • 增值税发票收款人复核人空白可以吗
  • 报刊杂志广告文案写作
  • 单位报销的发票
  • 计提附加税的会计分录怎么写
  • 一次性优惠税率表
  • 增值税普通发票税率
  • 借给其他企业的钱计入什么科目
  • 中小企业费用管理
  • 企业之间的无偿借贷行为,作为借款方需要缴纳哪些税
  • 临时文件夹移动到c盘根目录下windows7
  • 职工福利费扣除率是多少
  • 外购商品可以直接结转成本吗
  • php 如何下载
  • retrorun.exe - retrorun有什么用 是什么进程
  • 成品油消费税怎么抵扣
  • 我的世界1.12.2优化下载
  • php数组函数面试题
  • 高新技术企业研发费用归集
  • svchost一直在下载什么
  • Python之ImportError: DLL load failed: 找不到指定的模块解决方案
  • 分次发放年终奖怎么做账
  • 应付票据和应收票据的关系
  • 小茴香的栽培技术
  • php简单文件管理
  • Jetson Xavier NX配置全过程——安装jtop和OpenCV4.5.3(二)
  • php socket编程
  • 深入php:面向对象、模式与实践
  • 生育津贴有什么补贴
  • Vue Admin Template关闭eslint校验,lintOnSave:false设置无效解决办法
  • php实现简单的登录验证
  • 前端 组件化
  • 增值税代扣代缴税率是多少
  • 电子退库款
  • 销售自己使用过的固定资产
  • 员工辞退补偿金需要交个税吗
  • 银行回单打回来会计要做什么
  • 股权对价支付
  • 收到借款利息收入的会计分录怎么做账
  • 深入理解jvm第三版pdf百度云
  • 财政部关于印发财政专户管理办法的通知
  • 增值税进项税额转出的情况有哪些
  • 归还股东投资款本息怎么做账
  • 培训学校不退学费找什么部门
  • 两个独立核算单位可以共用一个账户吗
  • 公允价值变动损益属于什么科目
  • 新公司固定资产盘点总结
  • 供应商货款支付流程
  • 员工报销固定资产怎么算
  • 同时知识产权专利,其做账是?
  • 购买税控盘用银行抵扣吗
  • 润滑油开具增值税专用发票
  • 超市被盗怎么办
  • 结转资金和结余资金
  • 如何开展服务
  • 建筑企业结转收入成本
  • 关于存储过程的描述
  • mysql安装使用教程
  • windows更改图标大小
  • window windows10
  • centos6.5设置网络
  • win8电脑背景变成黑色的了是为什么
  • windowsxp打不开网页怎么办
  • ubuntu搭建安卓环境
  • 深入理解python特性
  • jquery事件委托原理
  • 国税纳税申报表打印
  • 山东省国税网
  • 2021年福利彩票47期
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设