php主要用于web开发,但作为一门脚本语言,在web开发中也常常用于处理数据,比如对于异步处理模式,php可能作为独立运行的程序从消息队列读取数据进行处理,再如用php进行相关数据库数据的修复,数据库数据重新构造等。
在用php处理数据时往往面对的数据量很大,为了快速处理数据,我们往往启动多个php进程进行并发处理,但启动多个进程并不好管理,所以需要一个框架将并发控制的相关细节包装起来,php并发控制框架PCF即是这个目的,让我们写php脚本相关并发程序时,不用关心并发的处理,只关心具体的业务处理,通过使用PCF,我们写的程序即能自动的并发运行起来,根本不用考虑并发处理细节。
使用PCF的目的是什么呢,主要有两个 :
1.使并发程序写起来更容易。写的单个脚本可以自动并发跑起来
2.使并发控制更简单。并发的进程数可以随时增多和减少,特意暂停或意外中止的程序会记录暂停点,下次执行时从暂停点继续执行。
PCF之于PHP脚本相当于PHP-FPM之于PHP解释器,一是进行进程的并发控制,二是管理对外信息的交互。如下图表示PCF框架运行图:
从上图可以看出,PCF主要完成了三个功能:
1.对原始数据的消息进行序列化2.多进程并发控制
3.对结果进行汇总处理。
当然,PCF只是提供了一个框架,实现细节由用户代码来实现,用户代码需要实现的的功能
2.单个消息处理逻辑
3.对最终结果的处理逻辑,当然这个是可选的
假设我们有如下的数据处理需求: 一共有200个表的数据,每个表有一百万的数据,对于每个数据要进行某种处理。为了高效处理,需要进行并发处理,这时我们可以定义消息为表的编号,如0-199,每于每个表进行相应处理。相应的用户代码假设在文件usercode.php中如下所示:
<?php
require_once 'currFrame.php';//包含框架代码
define('TABLENUM',10);
//用户类继承框架类
class Example extends CurrFrame {
/**
* 产生消息
*/
public function produce(){
for ($i = 0;$i <TABLENUM ;$i++){
$this->addMsg($i);//添加消息,此处为表序号
}
$this->endMsg(); //结束消息,如果没有更多消息,就要结束,否则总会尝试读取更多消息
}
/**
* 具体处理代码
* @param $msg 当前处理的消息
* @param $pos 当前处理到的位置
*/
public function process($msg,$pos = NULL) {
$no = $msg;
$j = $pos ==NULL ? 0:$pos;
for(;$j<10;$j++){
//此处放具体处理逻辑
$this->recordProcess($j); //记录处理进度
}
}
/**
*所有进程运行完成后执行的代码
*/
public function output(){
}
}
$obj = new Example();
$obj->run();
相关代码的解释见注释
启动并发只要执行 php usercode.php batch 3 ,表示启动3个并发,可以随时更改并发的参数,也可以设为0,表示停止所有的处理
框架代码已上传至github : https://github.com/micweaver/PCF