CurlMulti

来源:互联网 发布:class javascript mdn 编辑:程序博客网 时间:2024/04/29 17:47

主要特点

  • 极低的CPU和内存占用(占用可以忽略)。
  • 程序级别达到最好的效率(实测html采集最高2000+页面每秒,图片下载1000MBit/s)。
  • 自定义并发数,并且可以自定义任务类型,不同任务类型可以定义不同并发数。
  • 内置文件下载支持(回调实现,效率最高)
  • 通过回调返回cURL每个任务的运行信息和汇总信息(包含所有可以得到的运行数据)。
  • 可以通过回调添加任务。
  • 用户自定义回调函数(相当方便的执行用户的任意操作)。
  • cURL错误自动处理或指定回调函数处理。
  • cURL错误或用户自定义错误自动重试并自定义重试次数。
  • 可以使用缓存,自定义缓存目录,缓存目录深度,缓存时间。
  • 用户变量任意传递(包括广度和深度)。
  • 两种级别自定义CURLOPT并保持继承关系(比如检查页面404,url最终地址,多线程xmlrpc等等)。
下载地址:http://curlmulti.com/index/download
例子:http://blog.phpdr.net/curl%E5%A4%9A%E7%BA%BF%E7%A8%8B.html



运行机制

首先通过add()方法添加一个任务到任务池,也可以重复n次添加n个任务,任务池不会排重,所以防止重复采集需要在外部保证,回调函数在添加任务的时候指定。
任务添加完毕之后调用start()方法开始多线程采集,CurlMulti或从任务池取任务填充并发线程,只要有任务完成就会立刻调用任务对应的回调函数,回调函数执行完毕CurlMulti从任务池取一个任务填充并发线程,如果回调函数中分析出了更多的url需要采集,在回调函数中调用add()方法即可,CurlMulti的任务池是一个堆栈,所以后添加的任务总是被优先执行。
当所有任务完成并且任务池中没有更多的任务时,start()方法执行结束。
如果初始任务量有1000万,一次性添加显然不合适,这时候需要用回调函数添加任务,当任务池中没有任务的时候CurlMulti会尝试调用预先设置的回调函数。

API

public $maxThread = 10
CurlMulti的并发数,最大值和操作系统设置有关,这个并发数可以在运行中动态的改变!

public $maxThreadType = array ()
关联数组,类型为键,并发数为值,为每种类型的任务制定最大并发数,任务类型在add()方法中添加任务的时候指定,所有类型的任务并发总数可以超过public $maxThread!不指定类型的任务的最大并发数等于public $maxThread的值减去public $maxThreadType中并发数之和,这个数最小为零(小于零的时候会被置为零,等于零表示不指定类型的任务永远不会被执行)。这个值可以在程序运行中动态指定!

public $maxTry = 3
curl错误或用户自定义错误最大尝试次数。自动重试很有必要,比如有时候并发过大或采集的目标服务器可能偶然出错,或用户自定义了某种错误(比如目标服务器做了限制总是返回Server is busy这个字符串,但是没有curl错误并且http_code=200时需要用户自定义错误)。这个值可以在运行中动态改变!

public $opt = array ()
为所有任务指定CURLOPT_*,优先级低于add()中的$item[opt]

public $cache = array ('on' => false,'dir' => null,'expire' => 86400,'dirLevel' => 1)
控制缓存,如果$cache[on]=true,采集时优先检查是否有缓存,如果缓存不过期就返回缓存的数据,如果缓存过期就删除缓存,新采集的任务会写入缓存,dir定义缓存的顶级路径,CurlMulti会自动做子目录的hash(三层),保证每个目录最多4096个文件,下载文件时缓存不会起作用!
dirLevel 必须小于3。

public $cbTask = null
无参回调函数,添加大量任务时需要用到,如果任务池为空,CurlMulti会尝试调用这个回调函数,回调函数中需要执行add()方法。

public $cbInfo = null
任务信息回调函数,CurlMulti最快每秒调用一次,有一个数组参数,包含两个键all和running分别包含信息汇总和正在运行的每个任务的详细信息。

public $cbUser = null
用户回调函数,cURL批处理连接中有活动连接或处理结果的回调调用之后调用。

public $cbFail = null
作用和add()的第三个参数相同,区别是优先级低并且对所有任务有效。

public function __construct()
如果本类被继承,子类构造方法必须调用本类构造方法。

public function add(array $item, $process = null, $fail = null)
添加一个任务到任务池。
array $item
$item['url'] 是需要采集的url地址,必填。
$item['file'] 本地文件绝对路径,下载目标url的时候需要设置这个值。
$item['opt'] CURLOPT_* 数组,只对当前任务有效,继承public $opt的设置。
$item['args'] 在回调函数中接收的用户自定义参数,作为回调函数的第二个参数。
$item['ctl'] 保存控制信息,type定义当前任务的类型,用于不同类型的任务做不同的并发数(比如html采集和图片下载同时进行,但是两种采集的并发数是不同的),useCache定义当前任务是否读取缓存,不影响缓存的写入!
$process
任务成功完成(没有curl错误)后调用的函数,第一个参数是一个数组,数组有两个键info和content,分别保存http信息和采集内容,第二个参数是$item['args']的值。
$fail
当前任务失败调用的回调函数,第一个参数是一个数组,数组有两个键info和error,分别保存http信息和错误信息,其中error[0]保存curl错误码,error[1]保存错误信息(可能是curl错误,可能是用户自定义错误),第二个参数是$item['args']的值。

public function error($msg)
用户错误处理,应用场景:访问目标服务器如果并发超过某个限度或其他什么原因服务器可能返回一条错误信息,比如server is busy...,但是http_code=200,这时候最好的处理方式就是走$curl->maxTry的处理流程,错误统一到$curl->cbFail(或add中的fail回调)处理,回调的参数中有你需要的所有相关信息。
注意:这个函数必须在$process($curl->add()第二个参数指定的回调)中调用!

public function start()
开始执行任务,进入回调循环。

0 0
原创粉丝点击