文档章节

多线程批量静态化 java与php【原创】

大灰狼wow
 大灰狼wow
发布于 2014/04/09 09:15
字数 519
阅读 313
收藏 4

需求描述:现在网站的数量达到了3万多篇,全站都是静态化的,然而有时候改了网站的导航,问题大了。怎么办?跑php?单线程造成了我不得不停下其他工作,只为了跑脚本。而且中间可能会遇到错误,我又得重新开始跑。

其次,进度条的问题?php在跑脚本的时候 除非在cli下,不然cgi下根本不知道后台执行的进度。这个问题相到的大。

解决方案1:参考张宴的文章, 他采用了php扩展机制,支持多线程。

解决方案2:用java来写,java原生就支持多线程的。而且IO性能好。(不用修改原来的代码) 支持进度条反馈。

思路:多线程采集新闻的方式。

接下来是代码实现,我稍候发布出来。

参考资料:http://blog.s135.com/pthreads/

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class WebContent {
 private static int kernel = 4;// 针对服务器内核数
 public static void main(String args[]) {
  MyThread t = new MyThread();
  for (int i = 0; i < kernel; i++) {
   new Thread(t).start();
  }
 }
}
class MyThread implements Runnable {
 private int tickets = 34000;
 @Override
 public void run() {
  String url = "http://www.d-shang.com/news/v/?id=";
  // 获取id
  while (tickets > 0) {
   String filename = tickets + "";
   // 创建文件
   try {
    String content = getOneHtml(url, filename);
    if (content == null || content.length() < 200) {
     System.out.print(filename + " 线程"
       + Thread.currentThread().getId() + "不存在 跳过\r\n");
     tickets--;
     continue;
    }
    File file = new File("c:\\a/" + filename + ".html");
    Writer out = null;
    out = new FileWriter(file);
    out.write(content);
    out.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.print(filename + " 线程" + Thread.currentThread().getId()
     + "已生成 \r\n");
   tickets--;
  }
 }
 /**
  * 读取一个网页全部内容
  */
 public String getOneHtml(String htmlurl, String filename)
   throws IOException {
  URL url;
  String temp;
  final StringBuffer sb = new StringBuffer();
  try {
   url = new URL(htmlurl + filename);
   HttpURLConnection httpCon = (HttpURLConnection) url
     .openConnection();
   httpCon.setConnectTimeout(2000);
   httpCon.setReadTimeout(2000);
   httpCon.connect();// 建立连接
   final BufferedReader in = new BufferedReader(new InputStreamReader(
     url.openStream(), "utf-8"));// 读取网页全部内容
   while ((temp = in.readLine()) != null) {
    sb.append(temp);
   }
   in.close();
  } catch (final MalformedURLException me) {
   System.out.println("你输入的URL格式有问题!请仔细输入");
   me.getMessage();
   throw me;
  } catch (final IOException e) {
   return null;
  }
  return sb.toString();
 }
}

© 著作权归作者所有

大灰狼wow
粉丝 48
博文 394
码字总数 48677
作品 1
嘉兴
程序员
私信 提问
Apache Thrift介绍

Thrift是为了解决facebook系统中各系统之间大数据量的传输通讯以及系统之间语言环境不同需要跨平台这一特性而创造的。所以thrift可以支持多种程序语言,例如: C++, C#, Cocoa, Erlang, Haske...

吕坤
2013/02/19
372
0
Android Studio 插件——《阿里巴巴 Java 开发规约》的扫描插件

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/78337759 前言 好久没有写博客了,前不久的杭州云栖大...

紫雾凌寒
2017/10/25
0
0
DataNucleus Access Platform 3.2 正式版发布

DataNucleus 3.2 正式版发布了,支持 HBase、Neo4j 和 MongoDB 的批量删除操作;修复了批量修改字段为 null 时的 bug;修复了多线程使用的重要 bug;改进了 TypeConverter 处理;改进了 JPA ...

oschina
2013/03/12
394
0
Java多线程学习(二)synchronized关键字(2)

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
java面试必备之ThreadLocal

按照传统的经验,如果某个对象是非线程安全的,在多线程环境下对象的访问需要采用synchronized进行同步。但是模板类并未采用线程同步机制,因为线程同步会降低系统的并发性能,此外代码同步解...

编程老司机
2018/05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
20分钟前
7
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
今天
7
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
今天
13
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
今天
62
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部