- 论坛徽章:
- 0
|
我看到一些开源的curl-multi封装不够好, 于是闲着没事写了一个.
可以利用它搭建一个负责HTTP并发通讯的子程序.
如果将其中的CurlTaskList作成动态载入的形式(比如向某个urls服务器请求获取任务), 如果将OnFinished扩展成HTML Parser, (比如提取内容并存储, 解析出urls, 提交回urls服务器) 那么一个简陋的蜘蛛就搭起来了.
-------------
项目主页:
https://github.com/dulao5/parallel-curl
Parallel Curl
=============
一个高性能的HTTP并发客户端库 . 使用了curl_multi* .
特性:
* 并发执行(多路复用)
* 事件模式:
* 每个HTTP访问视为一个"Task"
* 主程序是个run()函数. 当Task执行完时, 会通知调用方, 调用方在On Finished事件中处理自己的任务;
* 我实现了一个Task迭代器, 你可以直接push task(类似数组), 也可以更灵活的扩充它
* live connection
* 内部有个Curl Pool , Curl Handle使用一次并不关闭连接, 下次请求会继续使用它.
* 其他Curl固有的特性
Classes
=======
* CurlMFetcher : 并发获取类, run函数相当于主程序
* CurlPool : curl handle cache
* CurlTaskList : 任务列表
* CurlTaskAbstract : Task抽象类, 你继承它实现自己的OnFinished事件代码
实例
=====
> php test/test.php test/urls.txt
> cat test/test.php
- <?php
- //autoload
- function __autoload($classname) {
- static $lib_path ;
- if(!$lib_path) {
- $lib_path = dirname(__FILE__)."/../inc/";
- }
- include("$lib_path/$classname.php");
- }
- //define your task implement
- class MyCurlTask extends CurlTaskAbstract {
- protected function onFinished() {
- $info = curl_getinfo($this->_curl);
- $contents = curl_multi_getcontent($this->_curl);
- //do something
- fprintf(STDERR, "%s\ttask\t%s\tfinished\n", date("Y-m-d H:i:s.u"), $this->_url);
- //todo
- //you can implement a http content parser , or save to file , or other
- }
- }
- //load task list
- $tasklist = new CurlTaskList();
- $opts = array(
- CURLOPT_VERBOSE => 0 ,
- CURLOPT_CONNECTTIMEOUT => 1,
- CURLOPT_RETURNTRANSFER => true,
- CURLOPT_ENCODING => 'gzip,deflate',
- );
- foreach(array_filter(array_map('trim', file($argv[1]))) as $url) {
- $tasklist->push(new MyCurlTask($url, $opts));
- }
- //using curl multi featcher and run
- $tunnels = 4;
- $curlm = new CurlMFetcher($tasklist, $tunnels);
- $curlm->setDebug(true);
- //run
- $curlm->run();
复制代码 |
|