本文实例讲述了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程序设计有所帮助。