php多进程使用场景

10 篇文章 0 订阅

pcntl介绍

扩展介绍

php多进程模块依赖pcntl扩展,官方手册介绍:http://php.net/manual/zh/book.pcntl.php

Note: 
1. 此扩展在 Windows 平台上不可用。 
2. 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。因此,不能再PHP Web开发中使用多进程。

 

安装扩展

 图片
 

处理文件

当一个文件包含许多任务(每个任务一行),并且各任务之间不存在执行的先后顺序关系,可以将文件进行分割(分割后的文件数量与进程数一致),然后使用多进程进行处理。

例如,现在有10个邮箱账号存储在文件mailist.txt中,每次发送邮件需要耗时2s,则采用单进程依次发送完这些邮件需要耗时20。 
如果采用多进程,例如3个进程进行处理,首先需要将文件按行数拆分成3个小文件,其中两个文件是4条记录,一个文件是2条记录。每个进程处理一个小文件,则不同进程发送完邮件的耗时为8、8、6,总耗时取最大值为8s。

拆分文件

 

原始文件 maillist.txt
图片 
拆分操作
图片
 

拆分后的文件

taska

图片 
taskb

图片

taskc图片
 

相关脚本

多进程调用脚本 text_task.php


图片

多进程执行脚本 text_mail.php
图片

输出结果

图片
 

在text_task.php中创建了3个进程(a、b、c),其中a和b处理的文件中有4条记录,c处理的文件中有2条记录。

通过输出结果可以得到: 
1. a、b、c 三个进程同时开始执行,开始时间戳1504499765 
2. c最先完成,完成时间戳1504499769,耗时4s 
3. a和c同时完成,完成时间戳1504499773,耗时8s

处理消息队列

这是另外一种常见的常见,我们将耗时操作放入消息队列,通过脚本从消息队列中取出并执行记录。如果通过单个进程依次读取并处理消息,容易使队列中积累大量数据,导致操作的延迟时间较长,这种场景可以通过多个进程来读取并处理消息。redis中的pop操作具有原子性,不会存在多个读取到相同的队列消息的情况。

多进程调用脚本 redis_task.php
图片

多进程执行脚本 redis_mail.php

图片

输出结果

图片
 

通过输出结果可以得到 
1. a、b、c三个进程同时开始执行,时间戳为1504499844 
2. a和c同时结束执行,分别处理了3条记录,时间戳为1504499850,耗时6s 
3. b最后结束执行,处理了4条记录,时间戳为1504499852,耗时8s

master-worker模式

我们模拟Web服务器处理http请求的操作,对于每个请求创建一个进程,用于处理请求内容。


图片

图片

输出结果:

图片

如果依次处理请求,总耗时为1+2+3+4+5+6=21s。每个请求创建一个进程的处理方式,总耗时是最耗时的请求操作6s。

多进程最好在方法、函数或者文件中单独使用,这样逻辑更加清晰,也便于分析和维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值