PHP使用CURL_MULTI实现多线程采集的解决办法
内容摘要
这篇文章主要为大家详细介绍了PHP使用CURL_MULTI实现多线程采集的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
这两
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
这两
文章正文
这篇文章主要为大家详细介绍了PHP使用CURL_MULTI实现多线程采集的简单示例,具有一定的参考价值,可以用来参考一下。
感兴趣的小伙伴,下面一起跟随php教程的小玲来看看吧!
这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的。同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助!
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | <code><?php $text = remote( array ( 'https://www.idcnote.com/' , 'http://www.baidu.com/' )); print_r( $text ); function remote( $urls ) { if (! is_array ( $urls ) or count ( $urls ) == 0) { return false; } $curl = $text = array (); $handle = curl_multi_init(); foreach ( $urls as $k => $v ) { $nurl [ $k ]= preg_replace( '~([^:\/\.]+)~ei' , "rawurlencode('\\1')" , $v ); $curl [ $k ] = curl_init( $nurl [ $k ]); curl_setopt( $curl [ $k ], CURLOPT_RETURNTRANSFER, 1); curl_setopt( $curl [ $k ], CURLOPT_HEADER, 0); curl_multi_add_handle ( $handle , $curl [ $k ]); } $active = null; do { $mrc = curl_multi_exec( $handle , $active ); } while ( $mrc == CURLM_CALL_MULTI_PERFORM); while ( $active && $mrc == CURLM_OK) { if (curl_multi_select( $handle ) != -1) { do { $mrc = curl_multi_exec( $handle , $active ); } while ( $mrc == CURLM_CALL_MULTI_PERFORM); } } foreach ( $curl as $k => $v ) { if (curl_error( $curl [ $k ]) == "" ) { $text [ $k ] = (string) curl_multi_getcontent( $curl [ $k ]); } curl_multi_remove_handle( $handle , $curl [ $k ]); curl_close( $curl [ $k ]); } curl_multi_close( $handle ); return $text ; }</code> |
注:关于PHP使用CURL_MULTI实现多线程采集的简单示例的内容就先介绍到这里,更多相关文章的可以留意
代码注释