php开启多线程下载
来源:互联网 发布:python用户手册 编辑:程序博客网 时间:2024/06/06 08:24
php开启多线程下载download_config = $download_config; $this->max_process_num = $max_process_num; $this->timeout = $timeout; // 日志文件 if($logfile){ $this->logfile = $logfile; }else{ $this->logfile = dirname(__FILE__).'/batch_download_'.date('Ymd').'.log'; } } /** * 执行下载 * @result Int */ public function download(){ // 已处理的数量 $handle_num = 0; // 未处理完成 while(count($this->download_config)>0){ // 需要处理的大于最大进程数 if(count($this->download_config)>$this->max_process_num){ $process_num = $this->max_process_num; // 需要处理的小于最大进程数 }else{ $process_num = count($this->download_config); } // 抽取指定数量进行下载 $tmp_download_config = array_splice($this->download_config, 0, $process_num); // 执行下载 $result = $this->process($tmp_download_config); // 写入日志 $this->to_log($tmp_download_config, $result); // 记录已处理的数量 $handle_num += count($result); } return $handle_num; } /** * 多进程下载文件 * @param Array $download_config 本次下载的设置 * @return Array */ public function process($download_config){ // 文件资源 $fp = array(); // curl会话 $ch = array(); // 执行结果 $result = array(); // 创建curl handle $mh = curl_multi_init(); // 循环设定数量 foreach($download_config as $k=>$config){ $ch[$k] = curl_init(); $fp[$k] = fopen($config[1], 'a'); curl_setopt($ch[$k], CURLOPT_URL, $config[0]); curl_setopt($ch[$k], CURLOPT_FILE, $fp[$k]); curl_setopt($ch[$k], CURLOPT_HEADER, 0); curl_setopt($ch[$k], CURLOPT_RETURNTRANSFER, true); curl_setopt($ch[$k], CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'); // 加入处理 curl_multi_add_handle($mh, $ch[$k]); } $active = null; do{ $mrc = curl_multi_exec($mh, $active); } while($active); // 获取数据 foreach($fp as $k=>$v){ fwrite($v, curl_multi_getcontent($ch[$k])); } // 关闭curl handle与文件资源 foreach($download_config as $k=>$config){ curl_multi_remove_handle($mh, $ch[$k]); fclose($fp[$k]); // 检查是否下载成功 if(file_exists($config[1])){ $result[$k] = true; }else{ $result[$k] = false; } } curl_multi_close($mh); return $result; } /** * 写入日志 * @param Array $data 下载文件数据 * @param Array $flag 下载文件状态数据 */ private function to_log($data, $flag){ // 临时日志数据 $tmp_log = ''; foreach($data as $k=>$v){ $tmp_log .= '['.date('Y-m-d H:i:s').'] url:'.$v[0].' file:'.$v[1].' status:'.$flag[$k].PHP_EOL; } // 创建日志目录 if(!is_dir(dirname($this->logfile))){ mkdir(dirname($this->logfile), 0777, true); } // 写入日志文件 file_put_contents($this->logfile, $tmp_log, FILE_APPEND); }}date_default_timezone_set('Asia/Shanghai');$base_path = dirname(__FILE__).'/phototest';$download_config = array( array('http://img.ads.csdn.net/2017/201707141625579530.jpg', $base_path.'/p1.jpg'), array('http://geek.csdn.net/assets/images/geek_logo.png', $base_path.'/p2.jpg'), array('http://images.csdn.net/20170718/Hans_meitu_401.jpg', $base_path.'/p3.jpg'),);$obj = new BatchDownLoad($download_config, 2, 10);$handle_num = $obj->download();echo 'download num:'.$handle_num.PHP_EOL;?>
查看原文:http://newmiracle.cn/?p=1885
阅读全文
0 0
- php开启多线程下载
- PHP用socket开启多线程
- PHP开启异步多线程执行脚本
- Linux中yum利用Axel开启多线程下载,加速
- PHP多线程批量采集下载图片
- php多线程下载远程多个文件
- PHP多线程批量采集下载图片
- 软媒魔方6.13正式版:软件管家开启多线程极速下载
- iOS 开启多线程
- 多线程的开启方法
- junit开启多线程
- 多线程安全开启问题
- 开启多线程的姿势
- 多线程开启定时任务
- PHP多线程批量采集下载美女图片的实现代码
- webclient 开启gzip下载
- 多线程下载
- 多线程下载
- java知识点
- 神经网络中的激活函数
- 大数据-Hadoop 启动 YARN
- 自动化工具Ansible:基于Jenkins+Ansible+GitLab的部署实践
- iOS 25个性能优化/内存优化常用方法
- php开启多线程下载
- 建立一个数组并比较他们的最值问题
- jsp常用核心标签实例
- logback配置示例
- POJ 2996 Help Me with the Game(模拟)
- java基础小知识
- C++程序开发过程
- list集合转对应类型的对象数组
- System.Net.Mail 发送邮件(带附件)