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 多线程下载的原理 首先获取到目标文件的大小,然后在磁盘上申请一块空间用于保存目标文件,接着把 ...
随机推荐
- CentOS7安装RabbitMQ,并设置远程访问
如果网速慢 可以直接到百度云分享中下载,然后拉到centerOS中,进行第二步即可 两个人安装包地址,提取码:z1oz 1.安装erlang环境 wget http://www.rabbit ...
- 什么是 ZFS文件系统?ZFS概念及特点简介
什么是 ZFS? ZFS(Zettabyte File System)是由SUN公司的Jeff Bonwick领导设计的一种基于Solaris的文件系统,最初发布于20014年9月14日. SUN被O ...
- SQL Server 10分钟理解游标
概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的.而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服. 正常面向集合的思维方式 ...
- IIS 图片 JS CSS 500错误
1.检查站点MIME类型是否可以正常加载
- java加密解密工具类
package com.founder.mrp.util; import java.nio.charset.StandardCharsets; import java.security.Key; im ...
- Appium中app的元素定位
app定位方式,本文只讲Android手机的定位方式. 前提条件是adb连接到模拟器或者是手机(具体连接方式这里不再讲解),证明已连接到设备 adb devices app元素定位工具一:UI Aut ...
- Nginx优化配置,轻松应对高并发
Nginx现在已经是最火的web服务器之一,尤其在静态分离和负载均衡方面,性能十分优越.接下来我们主要看下Nginx在高并发环境下的优化配置,主要是针对 nginx.conf 文件的属性设置.我们打开 ...
- mmap vs read
先放个结论: 内存映射通常比随机访问更快,尤其访问的对象是分离的和不可预测的. 内存映射会持续占用pages, 直到完成访问. 这意味当长时间重度使用一个文件很久之前, 然后你关闭了它, 然后再重新打 ...
- npm err! Unexpected end of JSON input while parsing near解决办法
npm install时出现npm err! Unexpected end of JSON input while parsing near错误 输入 npm cache clean --fore ...
- 19、localStorage.getItem得到的是[object Object] 的解决方案
实现本地存储,避免刷新页面数据丢失: localStorage.setItem 只能存储字符串, 所以在储存的时候先将对象转换为字符串 localStorage.setItem("local ...