纯 PHP 实现并支持 Keep-Alive 和并行抓取的新版 HttpClient

前段时间有抓取数据的需求,考虑到驻留长时抓取的性能需求,不可能一次一个 file_get_congents 调用,即便使用 curl 扩展可以解决并行抓取,但似乎也无法发挥出 Keep-Alive 的优势(即一次连接,多次请求)。

因此使用纯 PHP 代码开发了这个类库,是一个比较完整的 Http 客户端,主要特色:

* 1) 纯 PHP 代码实现,无需依赖任何扩展
* 2) 允许设置各种 HTTP 头,完整的支持 Cookie
* 3) 支持 301/302 重定向识别,可设置最多跳转的次数
* 4) 支持 Keep-Alive 连接,重用于同一主机下的其它请求
* 5) 支持 https 访问(需要 PHP 开启 ssl 扩展)
* 6) 支持 POST 表单的文件上传
* 7) 支持同时并行处理多个请求

其中TCP连接采用异步方式,并行处理采用 stream_select() 多路IO轮循实现,也支持回调函数处理HTTP响应结果。

最新源码:https://github.com/hightman/pspider/blob/master/lib/HttpClient.class.php

简要示范:

require 'HttpClient.class.php';

function test_cb($res, $req, $key)
{
   echo '[' . $key . '] url: ' . $req->getUrl() . ', ';
   echo 'time cost: ' . $res->timeCost . ', ';
   echo 'size: ' . number_format(strlen($res->body)) . "\n";
}

$http = new HttpClient('test_cb');

// 全部 URL 抓取完毕时一并返回,传入单个 URL 或数组组成的多个 URL
// 第一次请求可能因为域名解析等原因较慢
// 可以自行构造 HttpRequest 直接用 IP请求更快
$results = $http->get(array(
  'baidu' => 'http://www.baidu.com/',
  'sina' => 'http://news.sina.com.cn/',
  'google' => 'http://www.google.com.sg/',
  'qq' => 'http://www.qq.com/',
));

// 键名不变,值为 HttpResponse 对象
//print_r($results);
//您可以通过 HttpClient::debug('open'); 会详细打印很多信息。

纯 PHP 实现并支持 Keep-Alive 和并行抓取的新版 HttpClient》上有2条评论

  1. 大菜

    不好意思,我是个php小白,只能看懂一些简单的php代码,上面您写的这个Get的示范倒是明白了。不知道能否写个post的示范啊。谢谢了

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注