curl多线程下载类
<?php
/**
* curl多线程下载类
*/
class MultiHttpRequest
{
public $urls = array ();
private $res = array ();
private $curlopt_header = 0;
private $method = "GET";
private $curlopt = array ();
public function __construct($urls = false, $curlopt = array ())
{
$this->urls = $urls;
if ( !empty($curlopt) ) {
$this->curlopt = $curlopt;
}
}
public function set_urls($urls)
{
$this->urls = $urls;
return $this;
}
public function set_curlopt($name, $vale)
{
$this->curlopt[$name] = $vale;
}
public function is_return_header($b)
{
$this->curlopt_header = $b;
return $this;
}
public function get_curlopt()
{
return $this->curlopt;
}
public function set_method($m)
{
$this->medthod = strtoupper($m);
return $this;
}
public function set_curlopts($arr)
{
$this->curlopt = $arr;
}
public function start()
{
if ( !is_array($this->urls) || count($this->urls) == 0 ) {
return false;
}
$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 ) {
$this->res[$k] = curl_multi_getcontent($curl[$k]);
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);
foreach ( $this->curlopt as $k => $v ) {
curl_setopt($curl, $k, $v);
}
curl_multi_add_handle($handle, $curl);
return $curl;
}
private function exec_handle($handle)
{
$flag = null;
do {
curl_multi_exec($handle, $flag);
} while ( $flag > 0 );
}
public function getRes()
{
return $this->res;
}
}
class HDbutifulyGril
{
private $url = '';
private $savepath = '';
private $imagessavepath = array();
public function __construct($url,$savepath='')
{
$this->url = $url;
if( !empty($savepath) && !is_dir($savepath)){
mkdir($savepath,0777,true);
}
$this->savepath = $savepath;
}
/**
* 得到所有大图的url地址
* @param type $id
* @return array();
*/
private function getimagesurl($id = '')
{
$url = $this->url . $id;
$str = file_get_contents($url);
$arr = json_decode($str, true);
$images = array ();
$savepath = array();
if ( is_array($arr) && !empty($arr) ) {
foreach ( $arr['data'] as $v ) {
$url = $v['image']['original'];
$filename = $this->getFilenameBy($url);
if( !file_exists($filename)){ // 如果图片已经采集了就不要再采了
$images[] = $url;
$savepath[] = $filename;
}
}
}
$this->imagessavepath = $savepath;
return $images;
}
/**
* 通过url确定图片的保存地址
* @param string $url
* @return string
*/
private function getFilenameBy($url)
{
$tmp = explode('/', $url);
return $this->savepath . str_replace(',', '_', array_pop($tmp));
}
/**
* 开始下载
* @param int $id pid
*/
public function start($id = '')
{
$imgurl = $this->getimagesurl($id);
$imgs = $this->MultiDownByUrls($imgurl);
foreach ( $imgs as $k => $v ) {
if ( !empty($v) ) {
file_put_contents($this->imagessavepath[$k], $v);
}
}
}
/**
* 通过urls多线程下载图片
* @param array $urls
* @return array
*/
private function MultiDownByUrls($urls)
{
$opts = array (
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_AUTOREFERER => 1,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36'
);
$mutil = new MultiHttpRequest($urls, $opts);
$mutil->start();
return $mutil->getRes();
}
}
$url = 'http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gbk&word=%C3%C0%C5%AE%CD%BC&fr=ala&ala=1&alatpl=cover&pos=0#z=0&pn=&ic=0&st=-1&face=0&s=0&lm=-1';
$savepath = __DIR__.DIRECTORY_SEPARATOR.'images' . DIRECTORY_SEPARATOR;
$hd = new HDbutifulyGril($url,$savepath);
for ( $i = 1; $i < 100; $i++ ) {
$hd->start($i);
}
curl多线程下载类的更多相关文章
- [C#]多线程下载
发现电脑里以前编写的下载程序... 做个记录,那时做的挺匆忙的,没用委托,通过公开出窗体来修改下载进度,做的比较乱... ==!! 程序具体功能(流程): 1.检测系统托盘图标内的进程名是否符合要求 ...
- Java多线程下载初试
一.服务端/客户端代码的实现 服务端配置config @ConfigurationProperties("storage") public class StoragePropert ...
- PHP CURL 多线程 GET/POST 类
PHP CURL 多线程 GET/POST 类 2015-01-01 分类:技术文章 阅读(623) 评论(0) 如果有需要更正或更高效的建议,欢迎在OSchina分享~\(≧▽≦)/~ http:/ ...
- curl多线程类。
<?php /* * Curl 多线程类 * 使用方法: * ======================== $urls = array("http://baidu.com" ...
- Android 开发工具类 27_多线程下载大文件
多线程下载大文件时序图 FileDownloader.java package com.wangjialin.internet.service.downloader; import java.io.F ...
- java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例
什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...
- Python爬虫之多线程下载程序类电子书
近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: 那么我们是否可以通过Py ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- android 多线程下载 断点续传
来源:网易云课堂Android极客班第八次作业练习 练习内容: 多线程 asyncTask handler 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
随机推荐
- 统计numpy数组中每个值出现的个数
统计numpy数组中某一个值或某几个值出现的个数:sum(data==4) # 统计出现了几个cluster include0Cluster = sum(res == 0) include1Clust ...
- Jmeter之Bean shell使用(二)(转载)
转载地址:https://www.cnblogs.com/puresoul/p/4949889.html 上一篇Jmeter之Bean shell使用(一)简单介绍了下Jmeter中的Bean she ...
- SQLServer---------使用Excel 往sqlServer数据库中导入数据
1.右击创建好的表选择编辑200行 2.保证Excel的字段顺序与数据中顺序一致 3.选中好了后进行复制 4.打开文本 一个快捷方式 将excel 中的数据 黏贴放到文本中 5.点击sql ...
- 【源码阅读】SpringBoot-v2.2.0启动过程以及细节
启动流程 图如下: 以上流程图源文件(可导入https://www.processon.com):https://github.com/Mysakura/DataFiles 相关Event(org.s ...
- [转帖]springboot2.0配置连接池(hikari、druid)
springboot2.0配置连接池(hikari.druid) 原文链接:https://www.cnblogs.com/blog5277/p/10660689.html 原文作者:博客园--曲高终 ...
- C++指针与数组、函数、动态内存分配
C++指针 指针是用来存储地址的变量. 对于二维数组来说: a:代表的是首行地址: *a:代表的是首元素地址: **a:首元素: a+1:第二行地址: *a+2:首先*a是首元素地址,在首元素地址上+ ...
- Github 上的个人项目开源心得
原文链接 https://elfgzp.cn/2019/12/09/gortal-site-project 由于最近在 Github 发了一个个人开源项目 - 「gortal」一个使用 Go 语言开发 ...
- Echarts 学习系列(1)-5分钟上手ECharts
目录 写在前面 下载Echarts和主题 绘制一个简单的图表 写在前面 最近,在做某个项目的时候.需要使用的可视化的图表显数据.最后,选择了百度的Echarts. 下载Echarts和主题 1.获取E ...
- soup.select的用法
1.通过标签选择 # 选择所有title标签 soup.select("title") # 选择所有p标签中的第三个标签 soup.select("p:nth-of-ty ...
- drf--认证组件
目录 认证简介 用户认证RBAC(Role-Based Access Control) 局部使用 全局使用 源码分析 认证简介 使用场景:有些接口在进行访问时,需要确认用户是否已经登录,比如:用户需要 ...