标签 typecho 下的文章

前些天把主机的PHP版本升级到8.0。博客程序typecho也升级到1.2

typecho上一个稳定版本已经是5年前的事情了。在免费项目中,这类更新速度一般会被假定为濒死或死亡项目。附着的插件和模板项目也日渐式微。我使用熊猫的模板和部分插件现在也不更新了。升级typecho后,直接500错误。

期待已死亡项目的作者会给新程序做更新匹配?不太可能。眼下只有自己动手这条路子了。

于是,我断断续续花了点时间把不兼容的模板和插件进行匹配更改,顺道也把有一段时间没有接触的PHP新版本特性给补全一下。

这次更新还让我想起前段时间的一个小事情。

事情的经过是这样的:

前段时间单位有个同事联系我,让我维护一个大约10年前开发的小项目。项目主要是为实现部门一个简单的需求。因为这需求实在太小,我选择用自己最熟悉的PHP方案,并独立完成了开发。这次问题也不大,只是当初没有设想那么长远,字段设置范围超限了,不算大问题。

这同事半新人,科班出身,应该不会在这问题遇到困难。但,这同事表示自己不会PHP,还来了一句(原话):“现在谁还会用PHP开发程序啊?”我思索了一下这同事的话,好像对又好像不对,然后回答说:哦,是啊。

我现在虽然用PHP的情况不多。不过,“PHP是最好的编程语言”(不接受任何辩驳)。


linode-1.png

周末腾出了一点时间在linode部署了个VPS,Debian系统,标准的LNMP方案。顺便把博客迁移了过来。

线路选择的是日本的Tokyo2线路。Ping速度比测试线路稍微好一点,我用广州电信分了3个时段测试了一下,平均值是140ms左右。

这个VPS上只部署了一个typecho和一个WordPress,速度实际体验起来还凑合。只是不知道为何会出现偶发性无响应的情况。我通过ping测试初步判定不是主机的问题,DNS可能性较大。

目前DNS是托管在Cloudflare上,不知道是否由于取消了它的CDN造成的故障呢?下来抽时间再测试一下。

后续把其他需求都整体从digitalOcean上搬迁到Linode,和DO的服务关系正式结束。

以上。


markdown.jpg
Typecho 内置的 MarkDown 引擎是 SegmentFault 开发的 HyperDown 解析器,目前主要是在 Typecho 开发版上的,我一直都很困惑 HyperDown 解析器支持的 MarkDown 语法具体都有啥,今天终于在 GitHub 上看到了,就分享出来,就当是做个笔记了。期间也试过换MonodEditor.md,但是发现效率都一般,所以弃用了。现在还是使用博客自带的MD解释器。虽然功能一般,但是效率优先就不折腾了。

阅读全文


请输入图片描述
前段时间升级了Nginx.看了一下php,版本虽然不是很老,,但是最近看了一下php框架,貌似都是在php7的方向弄了.所以就直接顺便把php也升级了,也是使用源码编译方式实行的.现在大概说一下升级过程,仅供参考.

准备工作

可以参考一下我早期写的php升级过程,大致准备工作也是差不多.建议把常用的编译依赖如openssl,curl等先升级到最新的版本.升级方法自己百度一下.

阅读全文


Movable Type

MT是我使用时间最长的一个博客程序。它基于Perl,功能强大而且可靠性十分稳妥。然而,在快餐文化异常普及的当下,它显得有点疲态百出。它没有php程序的灵活、部署简易,直白点说是折腾。因为站点移到国外的VPS的原因,国内连接速度实在不敢恭维,因此MT也成了我困难丛丛的选择。无奈只能转投效率优先的typecho。

因为博客思路设计的差异,我仅仅转换了原来的文章及相关评论。涉及到的数据表也只有3个。有需要的朋友可以参考下。将下面的源码保存为php文件,放在typecho博客根目录然后运行即可。(建议做好相关数据库备份后,在本地转换成功后再上传)

    <?php
    /**
     * Typecho Blog Platform
     *
     * @copyright  Copyright (c) 2008 Typecho team (http://www.typecho.org)
     * @license    GNU General Public License 2.0
     * @version    $Id: index.php 1153 2017-03-12 10:53:22Z ezo.biz $
     */
    
    /** 载入配置支持 */
    if (!defined('__TYPECHO_ROOT_DIR__') && !@include_once 'config.inc.php') {
        file_exists('./install.php') ? header('Location: install.php') : print('Missing Config File');
        exit;
    }
    
    /** 初始化组件 */
    #Typecho_Widget::widget('Widget_Init');
    $d_MT = "blog";
    /**
     * 初始化mt数据库
     */
    $dbMT = new Typecho_Db('Mysql', 'mt_');
    $dbMT->addServer(array (
       'host' => '127.0.0.1',
       'user' => 'root',
       'password' => '123456',
       'charset' => 'utf8',
       'port' => '3306',
       'database' => $d_MT,
     ), Typecho_Db::READ | Typecho_Db::WRITE);
     Typecho_Db::set($dbMT);
    //清空原有数据
    $db->query("DELETE FROM `typecho_contents`;");
    $db->query("DELETE FROM `typecho_relationships`;");
    $db->query("DELETE FROM `typecho_comments`;");
    
    $a=$dbMT->query("SELECT entry_id,entry_created_on,entry_modified_on,entry_title,Entry_text,entry_text_more,entry_basename FROM mt_entry;");
    $posts = $dbMT->fetchAll($a);
    foreach($posts as $post){
      unset($sql);
      $post['entry_created_on'] = strtotime($post['entry_created_on']);
      $post['entry_modified_on'] = strtotime($post['entry_modified_on']);
      if(!empty($post['entry_text_more']) || ($post['entry_text_more'] !="")){
        $post['Entry_text'] = $post['Entry_text'].$post['entry_text_more'];
      }
      $post['Entry_text'] = preg_replace('/(http|https)(.*?)(ezo\.biz\/b\/).*?(\/)((?:[a-z0-9_-|\.|-]*)(\.)(gif|jpeg|jpg|png))/i', "https://ezo.biz/b_img/$5", $post['Entry_text']);
      $post['Entry_text'] = str_replace("http://ezo.biz","https://ezo.biz",$post['Entry_text']);
      $post['Entry_text'] = str_replace("http://www.ezo.biz","https://www.ezo.biz",$post['Entry_text']);
      $post['Entry_text'] = mysql_real_escape_string($post['Entry_text']);
      $post['entry_title'] = mysql_real_escape_string($post['entry_title']);
    
    
      /**
       * 修复typecho slug主键唯一的问题
       */
      $d = gmdate('Ymd',$post['entry_created_on']);
      $post['entry_basename'] = $post['entry_basename']."-$d";
    
    
      $sql = "INSERT INTO `typecho_contents` (`cid`, `title`, `slug`, `created`, `modified`, `text`, `order`, `authorId`, `template`, `type`, `status`, `password`, `commentsNum`, `allowComment`, `allowPing`, `allowFeed`, `parent`, `views`, `viewsNum`, `likesNum`)  VALUES (NULL, '$post[entry_title]', '$post[entry_basename]', '$post[entry_created_on]', '$post[entry_modified_on]', '$post[Entry_text]', '0', '1', NULL, 'post', 'publish', NULL, '0', '1', '1', '1', '0', '0', '0', '0');";
      //返回文章id
      $cid = $db->query($sql,Typecho_Db::WRITE,Typecho_Db::INSERT);
      //绑定目录
      $db->query("INSERT INTO `typecho_relationships` (`cid`, `mid`) VALUES ('$cid', '1');");
    
      /**
       * 转换评论
       */
      $b = $dbMT->query("SELECT comment_author,comment_created_on,comment_email,comment_entry_id,comment_ip,comment_text,comment_url FROM mt_comment WHERE comment_visible=1 AND comment_entry_id=$post[entry_id];");
      $comments = $dbMT->fetchALL($b);
      foreach ($comments as $comment) {
        # 批量导入评论
        $comment['comment_created_on'] = strtotime($comment['comment_created_on']);
        $db->query("INSERT INTO `typecho_comments` (`coid`, `cid`, `created`, `author`, `authorId`, `ownerId`, `mail`, `url`, `ip`, `agent`, `text`, `type`, `status`, `parent`) VALUES (NULL, '$cid', '$comment[comment_created_on]', '$comment[comment_author]', '0', '0', '$comment[comment_email]', '$comment[comment_url]', '$comment[comment_ip]', NULL, '$comment[comment_text]', 'comment', 'approved', '0');");
      }
    }