多说评论一次导回 Typecho 本地数据库

一、追忆往昔

第一次接触社交化评论类产品大概是在2012年左右,当时国内知名度较高的有多说、友言等,国际上比较有名的有Disqus,这类产品的优点在此就不多说了。

用过几款产品后,被多说漂亮的页面和体验所吸引,最终爱上了多说。开源的内容管理和博客系统换过很多,但评论只要能用多说,就一定用它。

后来被 typecho 的精简吸引,本人的个人博客系统也从 wp 换到 typecho,评论也一直用的多说。但 typecho 没有像 wp 那样完善的插件管理系统,看不到数据,加上对第三方的不信任(随时停更),所以也没有安装第三方插件;再加上是多说的死忠粉,实不实时同步到本地数据库也没什么大问题。

2017年3月21日,多说官方发布了一条重要通知:“多说即将关闭,将于2017年6月1日正式关停服务”。当时内心感慨万千,本想来个长篇大论感慨一下,奈何文采有限,最后发了一条朋友圈:

”多说“国内社交化评论”No.1“,如今竟然也落得如此下场!不能变现的项目,即使再优秀也难得长久,愿在新的领域里再创辉煌,前程似锦!”

感慨完了,数据还是要拿回来,既然是6月1日正式停止服务,那还是有大把时间可以挥霍的,所以一直也没上心。正好这个五一小长假来临前一天,感冒+高烧找上了门,只能在家闭门养病了(平时也不知道在瞎忙什么...)。

二、主要步骤

关于多说的数据格式和 typecho 表结构在这里就不分析了,主要说说主要步骤。这里是把多说json格式的数据转换成符合 typecho 表关系的 insert 语句,并写入到insert.sql文件中,有了这个文件相信聪明的你就知道该怎么做了!

1. 将多说数据导出

进入多说开发者后台=>工具=>导出数据,选中”包含文章数据“、”包含评论数据“,务必选中两项,然后导出数据,解压后拿到export.json文件备用。

2. PHP 代码如下:

在 export.json 同级目录新建import.php文件,代码如下【下载代码】:

<?php

// 读取 json 文件并转换成 php 数组
$json = file_get_contents("./export.json");
$data = json_decode($json, true);

// 文章数据
$threads = $data['threads'];    
// 评论数据
$posts = $data['posts'];    

// 多说的文章ID(thread_id)与 typecho 的文章ID(cid) 对应关系
$threadIdRelationCid = [];
foreach ($threads as $item) {
    $threadIdRelationCid[$item['thread_id']] = $item['thread_key'];
}

// 假设评论表 coid 小于10001,此处从10001开始自增,请根据实际最大值修改
$coid = 10001;
// 多说的评论ID(post_id) 与 typecho 的评论ID(coid) 对应关系
$postIdRelationCoid = [];
foreach ($posts as $item) {
    $postIdRelationCoid[$item['post_id']] = $coid++;
}

// 拼成多条 insert sql语句
$sql = '';
foreach ($posts as $item) {
    $coid = $postIdRelationCoid[$item['post_id']];
    $cid = $threadIdRelationCid[$item['thread_id']];
    $created = strtotime($item['created_at']);
    $author = $item['author_name'] ?: '';
    $mail = $item['author_email'] ?: '';
    $url = $item['author_url'] ?: '';
    $ip = $item['ip'];
    $text = $item['message'];
    $parent = 0;
    if (is_array($item['parents'])) {
        $parent = $postIdRelationCoid[$item['parents'][0]];
    }

    $sql .= "INSERT INTO `typecho_comments` 
(`coid`, `cid`, `created`, `author`, `authorId`, `ownerId`, `mail`, `url`, `ip`, `agent`, `text`, `type`, `status`, `parent`) VALUES
({$coid}, {$cid}, {$created}, '{$author}', 0, 1, '{$mail}', '{$url}', '{$ip}', NULL, '{$text}', 'comment', 'approved', $parent);\n";
}

// 将 sql 写入文件中
file_put_contents("./insert.sql", $sql);

echo "end \n";

在命令行执行php import.php 或在浏览器中访问import.php文件(推荐使用命令行方式),就会在该文件所在的目录生成一个insert.sql文件。

3. 小问题

部分评论数据里面可能会有 emoji 表情,但是 typecho 表的字符集是 utf8,如果需要保留 emoji 的童鞋把 pre_comments 表的字符集改成 utf8mb4 即可,不需要保留 emoji 表情的将 emoji 表情删掉重导即可。

本博客已切换到 typecho 自带的评论,默认的才是最好的!!!!!如果有和我一样需求的童鞋可以把代码拿去放心使用。

三、反思

不得不说,从产品角度讲,”多说“是一个非常优秀的产品,市场占有率非常高,但从商业角度讲,”多说“又是一个非常失败的案例,其成败都值得深思。

如果您看到了这篇文章,请留下您的思考!^_^


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

使用 PHPStorm + Xdebug 实现断点调试

一、配置 Xdebug

配置 Xdebug 相关参数,在 php.ini 文件中新增如下配置,如果没安装的,请参考《PHP 安装 Xdebug扩展》:

[xdebug]
xdebug.remote_enable = on
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.idekey = PHPSTORM

重启 Apache,查看配置是否生效。

二、配置 PHPStorm

1. 配置 Servers,主要配置项如下图:
Mac 路径为:PHPStorm->Preferences->Languages & Frameworks->PHP->Servers
Win 路径为:File->Settings->Languages & Frameworks->PHP->Servers

phpstorm-servers.png

2. 配置 Debug,确保 Debug port 和上面的对应,其它选项默认即可:
Mac 路径为:PHPStorm->Preferences->Languages & Frameworks->PHP->Debug
Win 路径为:File->Settings->Languages & Frameworks->PHP->Debug

phpstorm-debug.png

三、配置 XDebug helper

1. 在Chrome中搜索并安装 XDebug helper 扩展。

2. 安装成功后,在 Chrome 扩展程序列表中找到 XDebug helper,点击选项,将 IDE key 选项选为 PhpStorm

四、使用 PHPStorm + Xdebug 实现断点调试

1. 在 PHPStorm 中开启 Debug 监听,点击右上角像电话一样的图标,图标变绿表示成功;

2. 在 Chrome 中开启 XDebug helper 插件:
chrome-debug.png

3. 在 PHPStorm 中设置断点,在需要断点调试的代码行前面单击即可;

4. 在浏览器中访问进行断点调试,成功后我们将可以看到如下调试信息:
phpstorm-xdebug-result.png


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

PHP 安装 Xdebug 扩展

一、前言

1. Xdebug 简介

Xdebug 是一个开放源代码的 PHP 程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。当前最新版本为 Xdebug 2.5.0。

2. Xdebug 相关资料

官网:https://xdebug.org
官网文档:https://xdebug.org/docs

3. 选择合适的版本

如果不知道该下载哪个版本,官方提供了一个检测工具,只需要打印 phpinfo() 的信息,并全部复制到该工具的文本框内,并点击下面的“Analyse my phpinfo() output”按钮即可,官方将会提供详细的下载和安装介绍。工具传送门

如果官方的文档看不懂,可以继续往下看。

二、安装 Xdebug 扩展

以下为本人的安装步骤。

1. Linux、macOS 下安装

#下载、解压、安装、编译:

$ curl -O https://xdebug.org/files/xdebug-2.5.0.tgz
$ tar -zxf xdebug-2.5.0.tgz
$ cd xdebug-2.5.0
$ phpize
$ ./configure --with-php-config=/usr/bin/php-config
$ make
$ make install
Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20131226/

编译成功后会提示一个路径,表示已经将扩展放置在该位置。

#. 修改 PHP 的配置文件php.ini,加载 Xdebug 模块:

zend_extension=xdebug.so

#. 重启apache,检测是否安装成功:

$ sudo apachectl restart
$ php -m | grep xdebug

如果出现 xdebug 则表示安装成功。

2. Windows 下安装

Windows 下安装 Xdebug 扩展,只需下载对应的 xdebug.dll 扩展即可。
下载地址:https://xdebug.org/download.php

#. 首先查看本地的 php 信息:
phpinfo.png

#. 然后选择对应的 xdebug 版本进行下载:
xdebug-version-info.png

#. 将下载后的 .dll 文件放到 PHP 的 ext 目录,并修改 php.ini 配置文件,添加如下内容:

zend_extension=php_xdebug-2.5.0-5.5-vc11.dll

#. 重启apache,检测是否安装成功:
phpinfo-xdebug.png

如果出现该信息,则说明安装成功;如果 apache 重启失败,说明下载的扩展和 PHP 版本不匹配,请认真检查后重新下载。


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

Laravel 中使用 Redis 数据库

一、前言

Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串、散列、列表、集合、有序集合。

1. 安装 predis/predis

在 Laravel 中使用 Redis 之前,你需要通过 Composer 来安装 predis/predis 包(~1.0):

$ composer require predis/predis

2. 配置

Redis 的配置文件在 config/database.php。在该文件中,我们可以看到一个包含 Redis 服务信息的配置数组,如下:

'redis' => [

    'cluster' => false,

    'default' => [
        'host' => env('REDIS_HOST', 'localhost'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', 6379),
        'database' => 0,
    ],

],

然后在 .env 文件中配置如下三项为自己的信息:

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

对于开发来说,默认的配置已经完全可以满足大部分的应用了。但是,你可以自由的在你环境中修改这个配置。你可以简单的添加 Redis 服务的名称,并且指定相应的服务器地址和端口。

cluster 选项会告诉 Laravel Redis 客户端在你的 Redis 集群中进行客户端的分片,这样就可以构成节点池并且创建大量有效的 RAM。但是,你需要注意的是客户端分片并不能处理故障转移。因此,它主要用来从一个主要数据存储地址获取可用的缓存数据。

另外,你可以在你的 Redis 连接定义里添加一个 options 数组,这样你可以指定 Predis 的客户端选项。

如果你的 Redis 服务器引入了认证机制,那么你需要在你的 Redis 服务配置数组中添加一个 password 配置项来提供凭证。

二、与 Redis 进行交互

在 Laravel 中,我们可以通过使用 Redis 假面 的各种方法来与 Redis 进行交互。Redis 假面支持动态方法,这意味着我们可以在 Redis 假面上调用任何的 Redis 命令,假面会直接将命令传递给 Redis。

1. 基本使用

下面演示 Redis 的 string 类型使用:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Redis;

class RedisController extends Controller
{
    public function set()
    {
        Redis::set('name', 'sean');
    }

    public function get()
    {
        $name = Redis::get('name');
        var_dump($name);
    }
}

2. 使用多个 Redis 连接

可以通过使用 Redis::connection 方法来获取 Redis 的实例:

$redis = Redis::connection();

这会返回默认的 Redis 服务器的实例。如果你没有使用集群服务,你可以传递配置文件中所定义的服务名称到 connection 方法中:

$redis = Redis::connection('other');

3. 管道命令

管道流水线可以允许你在一个操作中对 Redis 服务器执行多个命令。pipeline 方法接收一个参数: Closure ,它会接收 Redis 的实例。你可以在闭包中发布所有的命令,它们将会在一个操作中进行处理:

Redis::pipeline(function ($pipe) {
    for ($i = 0; $i < 1000; $i++) {
        $pipe->set("key:$i", $i);
    }
});

其它的使用,大家如果有兴趣可以自己进行继续摸索!


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

PHP 安装 phpredis 扩展

本文主要介绍为 PHP 安装 phpredis 扩展,并用 PHP 代码连接 Redis 服务器。

一、安装 phpredis 扩展

1. Linux、macOS 下安装

#. 下载、解压、安装、编译:

$ curl -O https://nodeload.github.com/nicolasff/phpredis/zip/master
$ tar -zxf master
$ cd phpredis-master/
$ phpize
$ ./configure --with-php-config=/usr/bin/php-config 
$ make 
$ sudo make install
Password:
Installing shared extensions:     /usr/lib/php/extensions/no-debug-non-zts-20131226/

编译成功后会提示一个路径,表示已经将扩展放置在该位置。

#. 修改 PHP 的配置文件php.ini,加载 redis 模块:

extension=redis.so

#. 重启apache,检测是否安装成功:

$ sudo apachectl restart
$ php -m | grep redis

如果出现 redis 则表示安装成功。

2. Windows 下安装

Windows 下安装 phpredis 扩展,只需下载对应的 php_redis.dll 扩展即可。
下载地址:http://windows.php.net/downloads/pecl/snaps/redis/

#. 首先查看本地的 php 信息:
phpinfo.png

#. 然后选择对应的 phpredis 版本进行下载:
phpredis-info.png

#. 将下载解压后的 .dll 文件放到 PHP 的 ext 目录,并修改 php.ini 配置文件,添加如下内容:

;extension=php_igbinary.dll
extension=php_redis.dll

#. 重启apache,检测是否安装成功:
phpredis-extension.png

如果出现该信息,则说明安装成功;如果 apache 重启失败,说明下载的扩展和 PHP 版本不匹配,请认真检查后重新下载。

二、PHP 连接 Redis 服务器

下面演示使用 PHP 连接 Redis 服务器,首先开启 Redis 服务器。没有安装的童鞋请参考 《Redis 安装(一)》

#. 在服务器根目录下新建 redis.php,代码如下:

<?php

    //连接本地的 Redis 服务
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    //查看服务是否运行
    echo "Server is running: " . $redis->ping();

#. 访问 http://localhost/redis.php,如果出现以下内容,则说明连接成功:

Server is running: +PONG

本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

Redis 安装

一、前言

安装 Redis 是开始 Redis 学习之旅的第一步,安装之前先来个简单的介绍。

1. 版本规则

Redis 约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版,如:2.6,2.8;奇数版本是非稳定版,如:2.7,2.9。推荐生产环境使用稳定版本,目前最新的稳定版本是 3.2.5

2. 操作系统

Redis 兼容大部分 POSIX 系统 ,包括 Linux、macOS 等常用操作系统,在这些系统中推荐直接下载 Redis 源代码编译安装以获得最新的稳定版本。

Redis 官方不支持 Windows,但微软发布了一个可以在 Windows 运行的 Redis 分支,需要的童鞋也可以下载使用。

二、安装

下面介绍 Redis 的安装,只涉及亲测过的 Linux、macOS 和 Windows 三个操作系统。

1. Linux、macOS 下安装

下载、解压、安装:

$ wget http://download.redis.io/releases/redis-3.2.5.tar.gz
$ tar xzf redis-3.2.5.tar.gz
$ cd redis-3.2.5
$ make

编译成功后,就可以开启 Redis 服务端,命令如下:

$ src/redis-server 

然后打开 Redis 客户端与服务端进行互动,命令如下:

$ src/redis-cli 
127.0.0.1:6379> set name sean
OK
127.0.0.1:6379> get name
"sean"
127.0.0.1:6379>

2. Windows 下安装

当前 Redis 的 windows 最新稳定版本为 3.2.100,此处我们选择下载 Redis-x64-3.2.100.zip 即可。地址为:https://github.com/MSOpenTech/redis/releases。下载后解压压缩包,将解压后的文件夹复制到 D 盘下,并重命名为 redis。

下面我们开启 Redis 服务端,命令如下:

C:\Users\sean> D:
D:\>cd redis
D:\redis>redis-server.exe redis.windows.conf

打开 Redis 客户端与服务端进行互动,命令如下:

C:\Users\sean> D:
D:\>cd redis
D:\redis>redis-cli.exe
127.0.0.1:6379> set name sean
OK
127.0.0.1:6379> get name
"sean"
127.0.0.1:6379>

注:
(1). Redis 服务端默认加载 redis.conf 配置文件,由于压缩包中没有该文件,我们在此指定配置文件为 redis.windows.conf,大家可以根据自己的需要指定。
(2). 可以把redis的路径加到系统的环境变量中,这样以后就省得再切换磁盘和输路径啦!

三、相关资料

Redis 官网:http://redis.io
Redis Windows 版本:https://github.com/MSOpenTech/Redis


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

macOS 中使用 phpize 动态添加 PHP 扩展的错误解决方法

使用 phpize 动态添加 PHP 扩展是开发中经常需要做的事情,但是在 macOS 中,首次使用该功能必然会碰到一些错误,本文列出了这些错误的解决方法。

问题一:

执行 phpize 报错如下:

$ phpize 
grep: /usr/include/php/main/php.h: No such file or directory
grep: /usr/include/php/Zend/zend_modules.h: No such file or directory
grep: /usr/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:  

解决方法:

$ ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include /usr/include

PS:如果 sudo 授权后仍提示没有操作权限,请参考文章 macOS 中的 Rootless 机制

问题二:

执行 phpize 报错如下:

$ phpize 
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解决方法:

先安装 Homebrew :

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后安装 autoconf :

$ brew install autoconf

PS:Homebrew 的强大谁用谁知道。关于什么是 Homebrew,以及 Homebrew 的使用,请点击 Homebrew传送门。不建议手动安装 autoconf 软件包,因为依赖包太多~~


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

macOS 中的 Rootless 机制

一、前因

苹果从 OS X El Capitan 10.11 系统开始使用了 Rootless 机制,可以将该机制理解为一个更高等级的系统的内核保护措施,系统默认将会锁定 /system/sbin/usr 这三个目录。

二、后果

Rootless 机制虽然在一定程度上增加了系统的安全性,但作为一名开发人员会经常的操作 /usr 这个目录,这个时候你会发现你使用的任何命令都会提示没有操作权限,即使使用 root 权限也不行。

比如咱们在 /usr 目录下新建一个目录 myl,命令及提示如下:

$ sudo mkdir myl
Password:
mkdir: myl: Operation not permitted

从上面的代码可以看出,即使我们使用了 sudo 授权,还是没操作权限。下面咱们来介绍怎样关闭和开启 Rootless 机制。

三、开关 Rootless

关闭和开启 Rootless 非常简单,方法如下:

重启 Mac,听到开机启动声后按下 Command+R,进入恢复模式,在上面的菜单实用工具中找到并打开 Terminal(如果顶部没出现菜单,请继续重启^_^)。输入如下命令:

1. 关闭 Rootless

$ csrutil disable

2. 开启 Rootless

$ csrutil enable

执行完命令后,重启电脑即可生效。为了系统的安全,建议大家平时都开启 Rootless,只有需要时才暂时关闭。


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma

Homebrew - macOS 不可或缺的套件管理器

一、Homebrew 是什么?

Unix/Linux 安装软件的时候有个很常见、也很令人头疼的事情,那就是软件包依赖。值得高兴的是,当前主流的 Linux 两大发行版本都自带了解决方案,Red hatyumUbuntuapt-get

macOS 也是 Unix 系系统,忧伤的是 macOS 没有提供类似的解决方案,幸运的是有第三方提供了解决方案。本文介绍的就是 macOS 上最受欢迎的 Homebrew,Homebrew 简称 brew,是 macOS 上的软件包管理工具,能很方便的安装(及依赖包)和卸载软件。

二、Homebrew 的安装

Homebrew 的安装非常简单,安装需要使用 Ruby,macOS 中默认已经安装了 Ruby,所以只需复制如下命令到终端中执行即可:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

稍等片刻即可安装成功。

三、Homebrew 的使用

Homebrew 使用非常简单,常用的有搜索、安装、卸载软件,使用如下:

1. 搜索软件:brew search 软件名,如:

$ brew search wget

2. 安装软件:brew install 软件名,如:

$ brew install wget

3. 卸载软件:brew remove 软件名,如:

$ brew remove wget

四、相关资料

如需更多的资料,去官网和官方的 Github 去探索吧!

官网:http://brew.sh/index_zh-cn.html
Github:https://github.com/Homebrew/brew/


本文首发于马燕龙个人博客,欢迎分享,转载请标明出处。
马燕龙个人博客:http://www.mayanlong.com
马燕龙个人微博:http://weibo.com/imayanlong
马燕龙Github主页:https://github.com/yanlongma