PHP Curl 多线程实现
程序员文章站
2022-05-05 20:41:53
...
使用方法:
$urls = array("http://baidu.com", "http://bestlovesky.com", "http://google.com");
$mp = new MultiHttpRequest($urls);
$mp ->start();
下载: class_curl_multi.php
/**
* Curl 多线程类
* 使用方法:
* ========================
* $urls = array("http://baidu.com", "http://bestlovesky.com", "http://google.com");
* $mp = new MultiHttpRequest($urls);
* $mp->start();
* ========================
*/
class MultiHttpRequest
{
public $urls = array();
public $curlopt_header = 1;
public $method = "GET";
function __construct($urls = false)
{
$this -> urls = $urls;
}
function set_urls($urls)
{
$this -> urls = $urls;
return $this;
}
function is_return_header($b)
{
$this -> curlopt_header = $b;
return $this;
}
function set_method($m)
{
$this -> medthod = strtoupper($m);
return $this;
}
function start()
{
if (!is_array($this -> urls) or count($this -> urls) == 0)
{
return false;
}
$curl = $text = array();
$handle = curl_multi_init();
foreach($this -> urls as $k => $v)
{
$curl[$k] = $this -> add_handle($handle, $v);
}
$this -> exec_handle($handle);
foreach($this -> urls as $k => $v)
{
curl_multi_getcontent($curl[$k]);
echo $curl[$k] . "\n";
// $text[$k] = curl_multi_getcontent($curl[$k]);
// echo $text[$k], "\n\n";
curl_multi_remove_handle($handle, $curl[$k]);
}
curl_multi_close($handle);
}
private function add_handle($handle, $url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, $this -> curlopt_header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($handle, $curl);
return $curl;
}
private function exec_handle($handle)
{
$flag = null;
do
{
curl_multi_exec($handle, $flag);
}
while ($flag > 0);
}
}
php利用curl实现多线程的类,php curl多线程下载图片
分享一个php多线程类(其实是php利用curl实现的一个多线程类),有了这个类,我们也可利用该类执行多线程任务了
<?php
class curl_multi{
private $url_list=array();
private $curl_setopt=array(
'CURLOPT_RETURNTRANSFER' => 1,//结果返回给变量
'CURLOPT_HEADER' => 0,//是否需要返回HTTP头
'CURLOPT_NOBODY' => 0,//是否需要返回的内容
'CURLOPT_FOLLOWLOCATION' => 0,//自动跟踪
'CURLOPT_TIMEOUT' => 6//超时时间(s)
);
function __construct($seconds=30){
set_time_limit($seconds);
}
/*
* 设置网址
* @list 数组
*/
public function setUrlList($list=array()){
$this->url_list=$list;
}
/*
* 设置参数
* @cutPot array
*/
public function setOpt($cutPot){
$this->curl_setopt=$cutPot+$this->curl_setopt;
}
/*
* 执行
* @return array
*/
public function execute(){
$mh=curl_multi_init();
foreach($this->url_list as $i=>$url){
$conn[$i]=curl_init($url);
foreach($this->curl_setopt as $key => $val){
curl_setopt($conn[$i],preg_replace('/(CURLOPT_\w{1,})/ie','$0',$key),$val);
}
curl_multi_add_handle($mh,$conn[$i]);
}
$active=false;
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active and $mrc == CURLM_OK){
if(curl_multi_select($mh) != -1){
do{
$mrc=curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
$res=array();
foreach($this->url_list as $i => $url){
$res[$i]=curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
curl_multi_remove_handle($mh,$conn[$i]);//释放资源
}
curl_multi_close($mh);
return $res;
}
}
php使用多线程下载类示例:下载远程图片
$curl_mul=new curl_multi();
$curl_mul->setUrlList(array('http://www.baidu.com/img/baidu_sylogo1.gif','http://www.baidu.com/img/baidu_sylogo1.gif','http://www.baidu.com/img/baidu_sylogo1.gif'));
$a=$curl_mul->execute();
$i=1;
foreach($a as $v){
$filename=$i.'.gif';
[email protected]($filename,'a');
fwrite($fp2,$v);
fclose($fp2);
$i++;
}
转载于:https://my.oschina.net/mickelfeng/blog/125908
上一篇: Java之多线程下载网络资源
下一篇: C语言学习笔记---数组