前段时间有抓取数据的需求,考虑到驻留长时抓取的性能需求,不可能一次一个 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响应结果。
简要示范:(粘自github的README,不知能否正确显示)
require 'HttpClient.class.php';
function test_cb($res, $req, $key)
{
echo '[' . $key . '] url: ' . $req->getUrl() . ', ';
echo 'time cost: ' . $res->timeCost . ', 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'); 会详细打印很多信息。