php多线程抓取多个网页(一个_init()与curl_multi()的速度比较)

优采云 发布时间: 2022-01-10 11:16

  php多线程抓取多个网页(一个_init()与curl_multi()的速度比较)

  php中如何使用curl_init()和curl_multi_init()实现多线程?针对这个问题,本文文章详细介绍了相应的分析和答案,希望能帮助更多想要解决这个问题的朋友找到更简单更容易的方法。

  curl_init() 以单线程模式处理事物。如果需要使用多线程模式进行事务处理,那么PHP为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的函数。

  curl_init()和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 的相关传输信息。

  php的框架有哪些

  PHP 框架:1、Laravel,Laravel 是一个免费开源的 PHP 应用框架。2、Phalcon,Phalcon 是最快的 PHP 框架。3、Symfony,Symfony 是一个用于 web 项目的 PHP 框架。4、Yii,Yii 是一个快速、安全、专业的 PHP 框架。5、CodeIgniter,CodeIgniter 是一个非常敏捷的开源 PHP 框架。6、CakePHP,CakePHP 是一个古老的 PHP 框架。7. Kohana,Kohana 是一个敏捷但功能强大的 PHP 框架。

  php中如何使用curl_init()和curl_multi_init()实现多线程的答案分享在这里。希望以上内容对您有所帮助。如果还有很多疑惑,可以关注易宿云行业资讯频道,获取更多相关知识。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线