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

前段时间刚刚研究了curl多进程模式php中curl的多线程php多线程采集类

在查xunsearch的时候,看到hightman也写了个了《纯 PHP 实现并支持 Keep-Alive 和并行抓取的新版 HttpClient

我用一个国外网站进行了测试,855个页面,用时566s,总下载html 文件序列化文件以后66M,平均每个链接用时0.66s,相对来说,效率还是可观的。

但按一个200万记录的网站来算,单机需要连续采集15天,相对火车采集器这样可以同时开启10+进程的桌面软件来讲,效率差很多。

总的来说,这个效率还是非常好了,用合适的工具做合适的事情。
不过,我是同时将855个数组直接丢进去的。我看到文件中有“同一主机同一端口最大并发数”的设置项,可以设置同时并发的数量,但我没有修改,默认是3个并发

今天晚上花时间测试了一下修改多个并发的效率,分别测试了5,9,15个并发,可以看到效率有很好的提升,但失败率也有明显的增加,主要是对方网站明显变得不稳定了,503好多次。

另外,我看到获取的页面大小好像都是未经过gzip的,优化一下,应该还可以再有提升的空间。今天晚上把代码看了一下,发现有gzip处理的过程。

https://github.com/hightman/pspider/blob/master/lib/HttpClient.class.php

shuhai@Aspire:/wwwroot/pspider$ tail 5s.log 9s.log 15s.log 50s.log -n 1
==> 5s.log < == [1180794] url: x/x/1180794, time cost: 379.85061907768, size: 66,064 ==> 9s.log < == [1180003] url: x/x/1180003, time cost: 349.64194202423, size: 68,804 ==> 15s.log < == [1179730] url: x/x/1179730, time cost: 308.76141214371, size: 188,995 ==> 50s.log < == [1179730] url: x/x/1179730, time cost: 304.11532616615, size: 188,995

经过测试,由3个并发,提高到15个并发,效率提升是最快的,再增加到50效率并没有什么提升,失败率却有一些增加,10个并发基本上就达到网络瓶颈了,难以再提升。
总的来说,效率还是不错的说。