多线程图片下载

——————————————–基础不好先做上篇单线程,简单一点———————————————-

1、抓取图片链接

$file_contents = file_get_contents("http://beta.microdemo.soarsvr.com/");
preg_match_all('/\w+:\/\/[\w\.]+\/\w+\/\w+\/[\w\.]+(.jpg|.png)/',$file_contents, $pics);

  仍然可以自己写一个图片链接的数组进行测试

2、设置抓取时间(可以略过,页面显示时查看方便)

$pics = $pics[0];
$beginTime = time();           
$lastTime = $beginTime;        
$count = 0;                 
echo 'begin download at ' . date('Y-m-d H:i:s', $beginTime) . '<br/>';    

set_time_limit(300); 
echo date('H:i:s',time())."<br/><hr>";
$timeout = 5;  

3、抓取图片信息

$mh = curl_multi_init();                                  #返回url批处理的句柄
foreach ($pics as $k => $v) {
    $ch[$k] = curl_init();
    curl_setopt($ch[$k], CURLOPT_URL, $v);
    curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch[$k], CURLOPT_HEADER, 0);
    curl_multi_add_handle($mh, $ch[$k]);            #向curl批处理会话中添加单独句柄
}

do {
    $status = curl_multi_exec($mh, $active);               #处理在栈中的每一个句柄             
    $result = curl_multi_info_read($mh);            #获取当前解析的cURL的相关传输信息
    if ($result !== false) {
        $content = curl_multi_getcontent($result['handle']);     #那么这个函数将会以字符串的形式返回那个cURL句柄获取的内容。      
        $picName = substr($pics[$count], strrpos($pics[$count], '/')+1);   
        $savePath = './multi/';                         
        if (!is_dir($savePath)) {                           
            @mkdir($savePath, 0777);
        }
        $saveName = $savePath . $picName;                     
        $fp = fopen($saveName, 'w');              
        fwrite($fp, $content);                              
        fclose($fp);                                       
        $nowTime = time();                                    
        $takeTime = $nowTime - $lastTime;                     
        ++$count;                                              
        echo 'downloaded ' . $count . 'th picture take time ' . $takeTime . 's<br/>';            
        $lastTime = $nowTime;                               
    }
} while ($status == CURLM_CALL_MULTI_PERFORM || $active);
curl_multi_close($mh);          

4、设置结束时间

$endTime = time();                                         
$totalTime = $endTime - $beginTime;                        
echo '<hr>end download at ' . date('Y-m-d H:i:s', $endTime) . '<br/>';        
echo 'downloaded ' . $count . ' pictures take time ' . $totalTime . ' s<br/>';     

5、进入目录中查看图片。

猜你喜欢

转载自blog.csdn.net/yaradish/article/details/82153981