本文实例讲述了php多进程应用场景。分享给大家供大家参考,具体如下:
pcntl介绍
扩展介绍
php多进程模块依赖pcntl扩展,官方手册介绍:http://php.net/manual/zh/book.pcntl.php
Note:
1. 此扩展在 Windows 平台上不可用。
2. 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。因此,不能再PHP Web开发中使用多进程。
安装扩展
# 通过pecl安装pcntl扩展 sudo pecl install pcntl # 增加 extension=pcntl.so sodo vim /etc/php.ini # 检查扩展是否安装成功 php -m | grep pcntl
处理文件
当一个文件包含许多任务(每个任务一行),并且各任务之间不存在执行的先后顺序关系,可以将文件进行分割(分割后的文件数量与进程数一致),然后使用多进程进行处理。
例如,现在有10个邮箱账号存储在文件mailist.txt中,每次发送邮件需要耗时2s,则采用单进程依次发送完这些邮件需要耗时20。
如果采用多进程,例如3个进程进行处理,首先需要将文件按行数拆分成3个小文件,其中两个文件是4条记录,一个文件是2条记录。每个进程处理一个小文件,则不同进程发送完邮件的耗时为8、8、6,总耗时取最大值为8s。
拆分文件
原始文件 maillist.txt
000000@163.com
111111@163.com
222222@163.com
333333@163.com
444444@163.com
555555@163.com
666666@163.com
777777@163.com
888888@163.com
999999@163.com
拆分操作
split -a 1 -l 4 maillist.txt task
拆分后的文件
taska
000000@163.com
111111@163.com
222222@163.com
333333@163.com
taskb
444444@163.com
555555@163.com
666666@163.com
777777@163.com
taskc
888888@163.com
999999@163.com
相关脚本
多进程调用脚本 text_task.php
$cmds = [ ['/Users/zhezhao/www/work/text_mail.php','a'], ['/Users/zhezhao/www/work/text_mail.php','b'], ['/Users/zhezhao/www/work/text_mail.php','c'] ]; foreach ($cmds as $cmd){ $pid = pcntl_fork(); if($pid == -1){ exit('create process failed'); } if($pid > 0){ pcntl_wait($status,WNOHANG); }else{ pcntl_exec('/usr/bin/php',$cmd); } }
多进程执行脚本 text_mail.php
require 'MailWork.php'; $name = $argv[1]; echo $name." start #".time().PHP_EOL; $worker = new MailWork($name); $res = $worker->text_mail($argc,$argv); if($res === false){ echo $worker->getLastError(); }else{ echo $name." ".$res." works done # ".time().PHP_EOL; }
内容版权声明:除非注明,否则皆为本站原创文章。