pcntl介绍

扩展介绍

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

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

 

安装扩展

 php多进程使用场景
 

处理文件

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

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

拆分文件

 

原始文件 maillist.txt
php多进程使用场景 
拆分操作
php多进程使用场景
 

拆分后的文件

taska

php多进程使用场景 
taskb

php多进程使用场景

taskcphp多进程使用场景
 

相关脚本

多进程调用脚本 text_task.php


php多进程使用场景

多进程执行脚本 text_mail.php
php多进程使用场景

输出结果

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
php多进程使用场景

多进程执行脚本 redis_mail.php

php多进程使用场景

输出结果

php多进程使用场景
 

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

master-worker模式

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


php多进程使用场景

php多进程使用场景

输出结果:

php多进程使用场景

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

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

相关文章: