本文实例讲述了php中foreach结合curl实现多线程的方法。分享给大家供大家参考,具体如下:
多线程是php不支持的但我们可以通过foreach来伪多线程了,但这个伪多线程速度不一定比单线程要单到哪里去了,具体来看个例子.
在利用foreach语句循环图片URL,并通过CURL将所有图片进行本地保存的函数时,出现了只能采集到一个的问题,现将foreach和CURL结合进行多URL请求的方法进行下总结.
方法1:循环请求
1
2
3
4
5
6
7
8
9
10
|
$sr = array (url_1,url_2,url_3); foreach ( $sr as $k => $v ) { $curlPost = $v . '?f=传入参数' ; $ch = curl_init( $curlPost ) ; curl_setopt( $ch , CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 curl_setopt( $ch , CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回 $data = curl_exec( $ch ) ; echo $k . '##:' . $data . '<br>' ; } curl_close( $ch ); |
上面代码需要特别注意的是,curl_close 一定要放在foreach循环结束的外面,如果放在里面的话,就会出现我上面提到的多个IMGURL,只能采集到一个URL的问题.
方法2:多线程循环
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
|
<?php multi_threads_request( $nodes ){ $mh = curl_multi_init(); $curl_array = array (); foreach ( $nodes as $i => $url ) { $curl_array [ $i ] = curl_init( $url ); curl_setopt( $curl_array [ $i ], CURLOPT_RETURNTRANSFER, true); curl_multi_add_handle( $mh , $curl_array [ $i ]); } $running = NULL; do { usleep(10000); curl_multi_exec( $mh , $running ); } while ( $running > 0); $res = array (); foreach ( $nodes as $i => $url ) { $res [ $url ] = curl_multi_getcontent( $curl_array [ $i ]); } foreach ( $nodes as $i => $url ){ curl_multi_remove_handle( $mh , $curl_array [ $i ]); } curl_multi_close( $mh ); return $res ; } print_r(multi_threads_request( array ( 'http://www.zzvips.com' , 'http://tool.zzvips.com' , )); |
这里主要利用curl_multi_init()实现多个url 的请求,不过由于php自身并不支持多线程,所以伪多线程速度也不见得会比单线程快.
希望本文所述对大家PHP程序设计有所帮助。