php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
优采云 发布时间: 2021-12-08 05:19php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
从哪儿开始:
一系列数据量大、不热、希望被大量蜘蛛爬取的页面,在爬虫高峰期会有非常高的响应时间。
前辈做过这样的事情:将页面分成3个块,提供3个内部接口,入口文件使用curl_multi_*系列函数抓取3个内部接口的内容,放在一起成为一个页面。
怀疑这可能会影响性能。
是通过学习来分析的。
看了php官方手册,批量调用过程总结如下:
curl_multi_init—返回一个新的 curl 批处理句柄作为 curl_init 生成的单个 curl 句柄的容器
curl_multi_add_handle - 向 curl 批处理会话添加单个 curl 句柄。
curl_multi_exec—运行当前cURL句柄的子连接,curl_multi_select()的值
curl_multi_select—等待 curl 批处理中的所有活动连接
curl_multi_getcontent——如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出文本流
curl_multi_remove_handle—删除curl批处理句柄资源中的句柄资源
curl_multi_close—关闭一组 cURL 句柄
取PHP官网的示例代码:
疑惑和想法:
1.批量请求的原理
PHP没有多线程,是通过操作系统的多线程来实现的(看网上)
2. 批量请求是基于操作系统的多线程机制,理论上会消耗大量机器的cpu
一种。开发机上验证,大批量请求时cpu调用确实会急剧上升
湾 对比线上前端机的负载情况和页面响应时间加长的时间点,发现线上前端机的负载并没有明显增加(维持在0.3左右)
C。我在网上看到有人curl_multi_select()的返回值不是-1时(表示一个请求没有被处理过) usleep(100), sleep 避免不读取处理状态造成不必要的cpu压力.
注意:
2中的a和b存在矛盾,目前还没有找到根本原因
2中的c没有实际测试过
欢迎广大读者批评指正
作者:小帅将军