消息关闭
    暂无新消息!
︿ 1

curlmulti PHP采集类库

Cookman2017-06-15发布

特性
极低的CPU和内存使用率。

速度在程序层面最高(测试抓取HTML速度达到2000+页每秒,下载速度1000Mbps。

内部原生下载支持(使用curl文件下载回调,性能最高)。

支持全局并发设置和根据任务类型单独设置并发。

支持状态回调,运行中的所有信息都被返回,包括单独的每个任务信息。

支持通过回调添加任务。

支持用户自定义回调,可以在回调中做任何事情。

支持任务完成回退,用于等待先决条件完成。

支持全局错误回调和单独任务的错误回调,所有和错误相关的信息都被返回。

支持内部全自动重试。

支持用户参数任意传递。

支持CURLOPT_*全局设置和单个任务设置。

强大的内置缓存,可以设置全局缓存和单独任务缓存。

所有配置可以在运行中动态改变并生效!

基于此库你可以开发各种厉害的CURL应用。

运行机制
没有pthreads扩展支持,php是单线程顺序执行的,所以本类库大量使用回调函数。类库只有两个常用的方法,add()和start(),add()添加一个任务到内部任务池,start()开始以$maxTrhead设置的并发数进行回调循环,此方法是阻塞的直到所有任务完成。如果有大量的任务需要处理,使用$cbTask指定添加任务的回调函数,当并发不足并且任务池为空时此回调函数被调用。当一个任务完成之后add()中执行的处理回调立刻被执行,然后curl从任务池取一个任务添加到并发请求中。所有任务完成后start()函数结束。

文件
CurlMulti/Core.php

核心库。

CurlMulti/Base.php

核心库的封装,包含非常有用的工具和一些规范。非常易于使用,所有爬虫应该继承这个类。

CurlMulti/Exception.php

CurlMulti_Exception

CurlMulti/Base/Clone.php

一个完美的网站克隆工具。

phpQuery.php

https://code.google.com/p/phpquery/

API(CurlMulti_Core)
public $maxThread = 10
最大数限制跟操作系统和libcurl有关,和本库无关。

public $maxThreadType = array ()
为不同类型的任务设置单独的并发数,数组的键是类型(在add()中指定),值是并发数。不同类型的的并发数综合可以超过$maxThread。无类型任务的并发数是$maxThread减去所有类型的综合。无类型任务并发数小于零的话会被设置为零,这意味着无类型任务不会被执行除非运行中动态改变设置。

public $maxTry = 3
触发curl错误或用户错误之前最大重试次数,超过次数$cbFail指定的回调会被调用。

public $opt = array ()
全局CURLOPT_*,可以被add()中设置的opt覆盖。

public $cache = array ('enable' => false, 'enableDownload'=> false, 'compress' => false, 'dir' => null, 'expire' =>86400, 'dirLevel' => 1)
缓存选项很容易被理解,缓存使用url来识别。如果使用缓存类库不会访问网络而是直接返回缓存。

public $taskPoolType = 'stack'
有两个值stack或queue,这两个选项决定任务池是深度优先还是广度优先,默认是stack深度优先。

public $cbTask = array(0=>'callback',1=>'callback param')
当并发数小于$maxThread并且任务池为空的时候类库会调用$cbTask指定的回调函数。$cbTask[0]是回调函数,$cbTask[1]是传递给回调函数的参数。

public $cbInfo = null
运行信息回调函数,回调中使用print_r()可以查看详细信息,回调函数最快1秒钟调用一次。

public $cbUser = null
用户自定义回调函数,这个函数调用非常频繁,用户函数可以执行任何操作。

public $cbFail = null
失败任务回调,可以被add()中指定的错误回调覆盖。

public function __construct()
子类必须调用此函数。

public function add(array $item, $process = null, $fail = null)
添加一个任务到任务池

$item['url'] 不能为空。

$item['file'] 如果设置了这个参数url对应的内容会被下载到该文件,应该使用绝对路径,最后一层目录能够自动创建。

$item['opt']=array() 当前任务的CURLOPT_*,覆盖全局的CURLOPT_*。

$item['args'] 成功和失败回调的第二个参数。

$item['ctl']=array() 一些额外的控制项

$item['ctl']['type'] 任务类型,用在$maxThreadType属性。

$item['ctl']['cache']=array('enable'=>null,'expire'=>null) 任务缓存配置,覆盖合并$cache属性。

$item['ctl']['close'] 是否自动关闭curl句柄。

$item['ctl']['ahead'] 忽略$taskPoolType属性,此种类型的任务总是被优先加入并发中。

$process 任务成功完成调用此回调,回调的第一个参数是结果数组,第二个参数是$item['args']。如果回调中返回false,当前任务会被放到任务池的最后面(称为backoff)等待再次被执行(使用缓存实现),返回false是有风险的,必须自行保证不会出现无限backoff。

$fail 任务失败回调,第一个参数是相关信息,第二个参数是$item['args']。

public function error($msg)
一个强力方法,在成功回调中如果你认为当前任务是失败的,可以调用此函数走$curl->maxTry循环。

下载任务不受影响,如果走$curl->maxTry循环,一定不会写缓存。

必须在成功回调中调用此方法。

public function start()
开始回调循环,此方法是阻塞的。

public function getch($url = null)
获取一个curl句柄附带全局CURLOPT_*。

API(CurlMulti_Base)
function __construct($curlmulti = null)
使用默认的核心类或使用自行定义的子类或对象。

function hashpath($name, $level = 2)
获得hash相对路径,每个目录最大文件数是4096。

function substr($str, $start, $end = null, $mode = 'g')
获取开始和结束字符串之间的字符串,开始和结束字符串不包含在内。

function cbCurlFail($error, $args)
全局默认错误回调。

function cbCurlInfo($info)
默认的信息回调,以标准形式输出运行信息。

protected function curlInfoString($info)
获取信息字符串。

function hasHttpError($info)
判断http状态码是否是200。

function encoding($html, $in = null, $out = 'UTF-8', $mode = 'auto')
强力的转码函数,可以自动获取当前编码,转码后自动修改<head></head>中的编码,可选不同的转码函数。

function isUrl($str)
是否是一个绝对的url。

function uri2url($uri, $urlCurrent)
根据当前页面url获取当前页中的相对uri对应的绝对url。

function url2uri($url, $urlCurrent)
根据当前页面url获取当前页中的绝对url对应的相对uri。

function urlDir($url)
绝对url对应的目录,参数中的url应该是重定向之后的url。

function getCurl()
返回核心类的对象。



浏览次数 : 533
0 条评论