php多线程抓取网页(php里提供了一个函数curl_multi_init(组图))
优采云 发布时间: 2022-01-14 08:10php多线程抓取网页(php里提供了一个函数curl_multi_init(组图))
curl_init() 以单线程模式处理事物。如果需要使用多线程模式进行事务处理,那么PHP为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的函数。
curl_multi_init() 多线程可以提高网页的处理速度吗?今天我将通过一个实验来验证这个问题。
我今天的测试很简单,就是抓取网页的内容,需要连续抓取5次,使用curl_init()和curl_multi_init()函数完成,记录两次耗时,并比较得出结论。
首先,使用 curl_init() 单线程连续抓取网页内容 5 次。
然后,使用 curl_multi_init() 多线程连续抓取网页内容 5 次。
为了避免随机性,我测试了5次(通过CTRL+F5强制刷新),数据如下:
curl_init():
第一次
第二次
第三次
第四次
第五次
平均
时间(毫秒)
3724
3615
2540
1957年
2794
2926
curl_multi_init():
第一次
第二次
第三次
第四次
第五次
平均
时间(毫秒)
4275
2912
3691
4198
3891
3793
从测试结果来看,我们发现两种方式的耗时相差不大,只有700多毫秒。很多人原本以为多线程会比单线程花更少的时间,但事实并非如此。从数据上看,多线程比单线程花费的时间要多一点。但是对于一些事务来说,多线程处理不一定是追求速度,需要注意。
关于 curl_multi_init()
一般来说,考虑使用curl_multi_init()的时候,目的是同时请求多个url,而不是一个一个,否则需要curl_init()。
但是在使用curl_multi的时候,可能会遇到cpu消耗高、网页假死等现象。可以阅读《PHP使用curl_multi_select解决curl_multi网页假死问题》
curl_multi的使用步骤总结如下:
各功能作用说明:
curl_multi_init()
初始化 curl 批处理句柄资源。
curl_multi_add_handle()
将单独的 curl 句柄资源添加到 curl 批处理会话。curl_multi_add_handle()函数有两个参数,第一个参数代表一个curl批量句柄资源,第二个参数代表单个curl句柄资源。
curl_multi_exec()
解析一个curl批处理句柄,curl_multi_exec()函数有两个参数,第一个参数代表一个批处理句柄资源,第二个参数是一个引用值参数,表示剩余的单个curl句柄资源需要处理的数量。
curl_multi_remove_handle()
curl_multi_remove_handle()函数有两个参数,第一个参数代表一个curl批处理句柄资源,第二个参数代表一个单独的curl句柄资源。
curl_multi_close()
关闭批处理资源。
curl_multi_getcontent()
如果设置了 CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。
curl_multi_info_read()
获取当前解析的 curl 的相关传输信息。
原文链接: