【懒人向】如何快速转移一个亿的 Hexo 文章到 Typecho 数据库?

正所谓新年新气象,为了换个心情,同时也为了优化慢的不行的博客,香菇使用了新的博客程序(大雾) Typecho 整合 i / old / note 三站同时作为新年发文载体。可是文章迁移什么的成了头疼的问题,gmlog2 和 note 里边共计 16 篇文章手冻迁移并不是什么大问题,然而采用 Hexo 部署的老站中的 69 篇文章貌似是个稍大的工程,秉承菇星人热爱折腾的优良传统,香菇尝试写了个小工具用作 Hexo 到 Typecho 的文章迁移。

使用全宇宙最好的编程语言 PHP 编写,代码如下:

<?php
$mysql_server_name='localhost';
$mysql_username='root';
$mysql_password='123456';
$mysql_database='typecho';

$dir = './_posts';

if(file_exists($dir)){
 $files = scandir($dir);
 
  $conn = mysql_connect($mysql_server_name,$mysql_username,$mysql_password) or die("error connecting"); //连接
  mysql_query("set names 'utf8'"); //编码
 mysql_select_db($mysql_database, $conn); //打开数据库
  
  $cid = 0;
 print "<pre>";
  foreach($files as $file){
   if($file != "." && $file != ".."){
      $post = file_get_contents($dir."/".$file);
      $infos = explode("---", $post);
     //print $infos[0];
      $heads = explode("\n", $infos[0]);
     $TITLE = str_replace("\r", "", substr($heads[0], 7));
      $TIME = strtotime(substr($heads[1], 6));
      $SLUG = str_ireplace(".md", "", substr($file, 11));
     $lines = explode("\n", $post);
     $text = "<!--markdown-->";
      for($i = 0; $i < count($lines); $i++){
        if($i > 3) {
          $text .= $lines[$i]."\n";
        }
     }
     $TEXT = $text;
      
      $sql = "INSERT INTO `typecho_contents` (`title`,`slug`,`created`,`modified`,`text`,`order`,`authorId`,`template`,`type`,`status`,`password`,`commentsNum`,`allowComment`,`allowPing`,`allowFeed`,`parent`) VALUES ('$TITLE','$SLUG',$TIME,$TIME,'$TEXT',0,1,NULL,'post','publish',NULL,0,'1','1','1',0)";
     mysql_query($sql);
      
      $isIst = mysql_num_rows(mysql_query("SELECT * FROM `typecho_contents` WHERE `slug`='$SLUG'"));
      //print $isIst;
     if(!$isIst){
        $sql = "INSERT INTO `typecho_contents` (`title`,`slug`,`created`,`modified`,`text`,`order`,`authorId`,`template`,`type`,`status`,`password`,`commentsNum`,`allowComment`,`allowPing`,`allowFeed`,`parent`) VALUES ('$SLUG','$SLUG',$TIME,$TIME,'待编辑!',0,1,NULL,'post','publish',NULL,0,'1','1','1',0)";
       mysql_query($sql);
      }
     
      $cid += 1;
      $sql = "INSERT INTO `typecho_relationships` (`cid`,`mid`) VALUES ($cid,1)";
     mysql_query($sql);
      print "Down!($cid)\n";
   }
 }
 print "</pre>";
 
  mysql_close($conn); //关闭
}

使用方法:

  • 全新安装 Typecho 程序,选用 Mysql 数据库;
  • 清空库中 contents 和 relationships 两表的内容;
  • 将 Hexo 的文章(markdown文件)目录放到和此代码文件相同目录下;
  • 修改好代码中数据库用户名、密码、库名、文章路径、表前缀等信息;
  • 用浏览器访问(执行)此代码即可。

注:因为 SQL 拼接的关系,部分数据可能会导入失败,此时该代码会实时将导入失败的文章检测出来并作标记,方便手动调整。
另:代码未考虑性能,大概一个亿的数据是转换不得的。

版权声明:原创内容未经允许请勿转载。

标签: none

已有 41 条评论

  1. 云武 云武

    PHP 要多少呢?在本地php5.6提示代码line 25出错,线上php7.2无法打开自建的php,错误error 500

    1. Emmm记得好像是7.0,报错的话有可能是.md文件模板与代码里匹配的不一致。

  2. PHP 7.2 不想说话……

    1. 加密发布了,您可以在这里预览:https://blog.zhangsy.me/2018/08/22/%E4%B8%80%E4%B8%AA%E8%84%9A%E6%9C%AC-%E5%B0%86%E5%8D%9A%E6%96%87%E4%BB%8E-Marddwon-%E5%AF%BC%E5%85%A5%E5%88%B0-Typecho.html ,密码是"bysiitake.cn"

      1. 可以公开发布啦~

        1. 好哒,我用GPL发布吧,这样名字就可以名留清史了呢(逃

    2. 我用PDO重写了,请问可以发布吗?我计划用MIT协议,您看呢?
      --2018-08-22

      1. 哈哈哈 协议什么的没关系的 我也不太懂 能留名字已经很激动了~

  3. Feng Feng

    看到从Hexo迁徙到Typecho,有点……,我最近刚好相反,Hexo或Typecho,哪个更好一点,香菇社长能给个答案吗

    1. 这个就根据不同需求来讲咯:
      使用Hexo的话,如果只专心写作,配上一套心怡的主题,本地化的写作方式,纯静态的页面……带来的是超低的资源占用,能有效降低主机被攻击而崩溃的几率,还有助于搜索引擎的收录。相应带来的问题便是部署及更新上的小小不便(当然这种不便能通过使用“便携版Hexo”等工具最大化减少)和页面个性化修改的不灵活;
      使用Typecho的话,总体来讲跟使用wp,em等博客程序相似,php的后端和mysql/sqlite的数据持久化存储使得博客极易部署,轻量化的设计理念也让它保持在相对较低的资源占用状态。后台在线的写作方式带来的是随时随地写作更新的良好体验,日渐丰富的第三方皮肤和插件也能让博客时刻焕发生机,再懂一些前端和php知识的话就可以更方便的个性化博客界面和功能,适合喜欢折腾的博主。而因此带来了一些缺点:后端脚本的存在增加了被攻击而宕机的风险(但好的博客环境及可信任的主机商可以有效避免这些问题),同时与更成熟的wp相比主题和插件的数量就显得逊色了。
      以上观点,香菇拙见。(●ˇ∀ˇ●)

      1. Feng Feng

        香菇社长写的太好了,分析的也很透彻,也能明白你为什么会从Hexo迁徙到Typecho,谢谢这么精彩的回复(●ˇ∀ˇ●)

  4. 慢灵魂 慢灵魂

    觉得hexo g慢的可以试一下hugo,比hexo生成速度快

    1. 阿嘞~还咩有用过GO的程序耶~可以在本地玩玩。嗯!

  5. 故事会 故事会

    一个亿,太夸张了吧?

    1. 嗯~说起来是有些夸张[托腮]

评论已关闭