介绍

Composer是PHP中的一个依赖管理工具. 它可以让你声明自己项目所依赖的库,然后它将会在项目中为你安装这些库。

依赖管理

Composer不是包管理器。是的,它实际上和”包”或者库打交道,但是它是以项目为单位进行管理,把它们安装到你项目中的一个目录(例如vendor)。默认情况下它不会以全局的方式安装任何东西。因此,它是一个依赖管理器。

这个想法并不新鲜,Composer的灵感是来自于node的npm和ruby的bundler。但是目前PHP还没有一个这样的工具。
Composer解决的问题是:

  • 你有一个依赖N多库的项目。
  • 这些库中一些又依赖于其他的库。
  • 你声明你所依赖的库。
  • Composer找出哪些包的哪个版本将会被安装,然后安装它们(也就是把它们下载到你的项目中)。

声明依赖关系

假设你正在创建一个项目,然后你需要一个日志操作的库。你决定使用monolog。为了把它加入到你的项目中,你需要做的就是创建一个名为composer.json的文件,其描述这个项目的依赖关系。

1
2
3
4
5
{
"require": {
"monolog/monolog": "1.2.*"
}
}

我们简单的描述说我们的项目依赖某个monolog/monolog包,版本只要是以1.2开头的就行。

系统要求

Composer需要PHP 5.3.2+ 才能运行。一些灵敏的PHP设置和编译选项也是必须的,不过安装程序 installer 会警告你任何不兼容的地方。
如果想要从源码而不是简单的从zip压缩包中安装软件包的话,你将需要git,svn或者hg,这依赖于软件包是通过什么进行版本控制的。
Composer是兼容多平台的,并且我们力争使其在Windows,Linux和OSX上的运行无差异。
安装 - *nix下载Composer可执行程序局部安装
为了获取Composer,我们需要做两件事。第一个是安装Composer(前面说过了,这意味下载它到你的项目中):

1
$ curl -sS https://getcomposer.org/installer | php

这只会检查一些PHP设置,然后下载composer.phar到你的工作目录中。这个文件是Composer二进制文件。它是一个PHAR PHP archive,PHP的归档格式,也可以像其他命令一样在命令行上运行。
你可以使用--install-dir选项,并且提供一个目标目录(可以是绝对或者相对路径)从而把Composer安装到一个指定的目录:

1
$ curl -sS https://getcomposer.org/installer | php -- --install-dir=bin

你可以把这个文件放到任何你想放的地方。如果你把它放到你的PATH中,你就可以全局访问它了。在类unix系统中你甚至可以使它可执行,并且调用的时候不需要php。
你可以执行这些命令从而能够在你的系统上简单的访问composer:

1
2
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer

然后,只需要执行composer命令来运行Composer,而不是php composer.phar。

Windows使用安装程序

这是在你的机器上安装Composer最简单的方法。
下载并运行Composer-Setup.exe,它将会安装最新的Composer版本并且设置好PATH,然后你就可以在命令中的任何目录下调用composer了。
手动安装
切换到一个存在于PATH环境变量中的目录,然后执行安装代码片段来下载composer.phar:

1
2
C:\Users\username>cd C:\bin
C:\bin>php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

创建一个新的以.bat结尾的composer文件:

1
C:\bin>echo @php "%~dp0composer.phar" %*>composer.bat

关闭你当前的终端。打开一个新的终端测试一下:

1
2
3
4
C:\Users\username>composer -V
Composer version 27d8904

C:\Users\username>

使用Composer

我们接下来要使用Composer来安装项目的依赖。如果你在当前目录下没有一个叫作composer.json的文件,请跳到基本使用章节。
为了解决并下载依赖,运行install命令:

1
$ php composer.phar install

如果你是全局安装,并且目录下没有phar文件,那么运行这个:

1
$ composer install

如果是上面的例子,这个操作将会下载monolog到vendor/monolog/monolog目录。
自动加载
除了下载库之外,Composer也会创建一个自动加载文件,这个文件能够自动加载Composer下载的库中所有的类。如果想使用它,只需要在你代码启动的地方加上如下代码:

1
require 'vendor/autoload.php';

哇哦!现在开始使用monolog吧! 如果想进一步学习Composer,继续阅读「基本使用」章节。 如果想要找需要的package,到Packagist。

参考 英文原文:http://getcomposer.org/doc/00-intro.md

(完)

二维码是什么?

百度百科上是这样介绍二维码的:二维码(Quick Response Code),又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形,是所有信息数据的一把钥匙。在现代商业活动中,可实现的应用十分广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子商务应用、车辆管理、信息传递等。如今智能手机扫一扫(简称313)功能的应用使得二维码更加普遍,随着国内物联网产业的蓬勃发展,更多的二维码技术应用解决方案被开发,二维码成为移动互联网入口真正成为现实。

QRCode.js说明

QRCode.js是一个实现生成二维码(QRCode)的js插件。 QRCode.js有着良好的跨浏览器兼容性(高版本使用HTML5的 Canvas,低版本IE使用table元素绘制),而且QRCode.js没有任何依赖。只需要引用一个QRCode.js。

使用QRCode.js

引入qrcode.js

1
<script src=”qrcode.js” type=”text/javascript”></script>

HTML代码

1
<div id=”qrcode”></div>

JS代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//初始化QRCode对象
var qrcode = new QRCode(document.getElementById(“qrcode”));

//也可以在初始化QRCode对象,传入更多参数
var qrcode = new QRCode(document.getElementById(“qrcode”),{
width: 128,
height: 128,
colorDark : “#000000″,
colorLight : “#ffffff”,
correctLevel : QRCode.CorrectLevel.H
});

//需要生成二维码的字符串
qrcode.makeCode(“http://www.leixuesong.cn”);

//清除二维码
qrcode.clear();

参数说明

参数 类型 说明
render string 配置用哪个节点元素画二维码,选项有table、svg和canvas,默认的选择顺序为 canvas -> svg -> table
text string 要编码的字符串,默认为空
width number 二维码的长,单位是px 需要注意的是,当使用table或者svg绘制二维码时,会适当减小,使得能够整除二维码矩阵的维度。 默认:256
height number 同width
correctLevel number 纠错级别,可取0、1、2、3,数字越大说明所需纠错级别越大,默认:3
background color 背景色,默认:#FFFFFF
foreground color 前景色,默认:#000000

浏览器兼容性

几乎支持所有浏览器: IE6~10, Chrome, Firefox, Safari, Opera, Mobile Safari, Android, Windows Mobile.

到这里,js生成二维码插件-QRCode.js就介绍完了,QRCode.js非常的方便好用。需要注意的的是QRCode初始化传入DOM对象时,必须是js原生的DOM对象,不能是jQuery的DOM对象的,否则就会报错。

GitHub地址: https://github.com/davidshimjs/qrcodejs
二维码生成原理:http://www.thonky.com/qr-code-tutorial/

Welcome to Hexo! Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

More Info

Git 基础

简单地说,Git 究竟是怎样的一个系统呢?

请注意接下来的内容非常重要,若您理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余。
在开始学习 Git 的时候,请努力分清您对其它版本管理系统的已有认识,如 Subversion 和 Perforce 等;这么做能帮助您使用工具时避免发生混淆。
Git 在保存和对待各种信息的时候与其它版本控制系统有很大差异,尽管操作起来的命令形式非常相近,理解这些差异将有助于防止您使用中的困惑。

直接记录快照,而非差异比较

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。 概念上来区分,其它大部分系统以文件变更列表的方式存储信息。 这类系统(CVS、Subversion、Perforce、Bazaar 等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

Git 存储项目随时间改变的快照。存储项目随时间改变的快照.这是 Git 与几乎所有其它版本控制系统的重要区别。 因此 Git 重新考虑了以前每一代版本控制系统延续下来的诸多方面。 Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。

近乎所有操作都是本地执行

在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。如果您习惯于所有操作都有网络延时开销的集中式版本控制系统,Git 在这方面会让您感到速度之神赐给了 Git 超凡的能量。 因为您在本地磁盘上就有项目的完整历史,所以大部分操作看起来瞬间完成。

举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。 您能立即看到项目历史。 如果您想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。

这也意味着您离线或者没有 VPN 时,几乎可以进行任何操作。 如您在飞机或火车上想做些工作,您能愉快地提交,直到有网络连接时再上传。 如您回家后 VPN 客户端不正常,您仍能工作。 使用其它系统,做到如此是不可能或很费力的。 比如,用 Perforce,您没有连接服务器时几乎不能做什么事;用 Subversion 和 CVS,您能修改文件,但不能向数据库提交修改(因为您的本地数据库离线了)。 这看起来不是大问题,但是您可能会惊喜地发现它带来的巨大的不同。

Git 保证完整性

Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若您在传送过程中丢失信息或损坏文件,Git 就能发现。

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

1
24b9da6552252987aa493b52f8696cd6d3b00373

Git 中使用这种哈希值的情况很多,您将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

Git 一般只添加数据

您执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。 同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦您提交快照到 Git 中,就再难丢失数据,特别是如果您定期的推送数据库到其它仓库的话。

这使得我们使用 Git 成为一个安心愉悦的过程,因为我们深知可以尽情做各种尝试,而没有把事情弄糟的危险。 更深度探讨 Git 如何保存数据及恢复丢失数据的话题,请参考“Undoing Things”。

三种状态

好,请注意。 如果您希望后面的学习更顺利,记住下面这些关于 Git 的概念。
Git 有三种状态,您的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。

每个项目都有一个 Git 目录(译注:如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone –bare 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。

基本的 Git 工作流程如下:

Git flow

Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

  1. 在工作目录中修改某些文件。
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

所以,我们可以从文件所处的位置来判断状态:如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。到第二章的时候,我们会进一步了解其中细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。

安装Git

是时候动手尝试下 Git 了,不过得先安装好它。有许多种安装方式,主要分为两种,

  • 一种是通过编译源代码来安装;
  • 一种是使用为特定平台预编译好的安装包(yum | apt-get)。
  • WIN下自动Google,或去官网自行下载

初次运行 Git 前的配置

一般在新的系统上,我们都需要先配置下自己的 Git 工作环境。配置工作只需一次,以后升级时还会沿用现在的配置。当然,如果需要,你随时可以用相同的命令修改已有的配置。

Git 提供了一个叫做 git config 的工具(译注:实际是 git-config 命令,只不过可以通过 git 加一个名字来呼叫此命令。),专门用来配置或读取相应的工作环境变量。而正是由这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:

/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件。
~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件。
当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是

1
C:\Documents and Settings\$USER

此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

用户信息

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

1
2
$ git config --global user.name "sphenginx"
$ git config --global user.email sphenginx@sphenginx.com

如果用了--global选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 –global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

文本编辑器

接下来要设置的是默认使用的文本编辑器。Git 需要你输入一些额外消息的时候,会自动调用一个外部文本编辑器给你用。默认会使用操作系统指定的默认编辑器,一般可能会是 Vi 或者 Vim。如果你有其他偏好,比如 Emacs 的话,可以重新设置:

1
$ git config --global core.editor emacs

差异分析工具
还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

1
$ git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。当然,你也可以指定使用自己开发的工具,具体怎么做可以参阅第七章。

查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

1
2
3
4
5
6
7
8
$ git config --list
user.name=sphenginx
user.email=sphenginx@gmail.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。

https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速:

设置记住密码(默认15分钟):

1
git config --global credential.helper cache

如果想自己设置失效时间,可以这么设置:

1
git config credential.helper 'cache --timeout=3600' //这样就设置一个小时之后失效

长期储存密码:

1
git config --global credential.helper store

注:This [git-credential-cache] doesn’t work for Windows systems as git-credential-cache communicates through a Unix socket

The wincred helper was added in msysgit 1.8.1. Use it as follows:

1
git config --global credential.helper wincred

Finally, launch a command prompt and type:

1
git config --global credential.helper winstore

附:https 方式使用git@osc设置密码的方式

总结一下commit的几种姿势:

传统姿势:先 “git add file” 再 “git commit -m ‘xxx’ “
快速提交当前所有文件的更改:”git commit -am ‘xxx’” 会先add所有的更改然后提交
快速提交单个文件的更改:”git commit file -m ‘xxx’ “ 只提交这个文件的更改
修改最后一次提交:”git commit –amend -am ‘xxx’ “将当前的更改加入最后一次commit中并更改最后一次commit的信息。

Git tips

  • 设置config信息

    1
    2
    3
    $ git config --global user.name sphenginx
    $ git config --global user.email sphenginx@sphenginx.com
    $ git config --list
  • 生成ssh key

    1
    ssh-keygen -t rsa -C "sphenginx@gmail.com"
  • 查看config信息

    1
    git config --list
  • 彩色的 git 输出:

    1
    git config color.ui true
  • 显示历史记录时,只显示一行注释信息:

    1
    git config format.pretty oneline
  • 不替换win下的CRLF设置

    1
    git config core.autocrlf false
  • win下使用https地址的仓库不输入密码设置

    1
    git config credential.helper wincred
  • 获取我的Github的PHP笔记仓库

    1
    git clone https://github.com/sphenginx/sphenginx.git
  • 设置远程仓库地址

    1
    2
    3
    4
    git remote -v
    git remote --help
    git remote set origin https://github.com/sphenginx/sphenginx.git
    git remote set-url origin https://github.com/sphenginx/sphenginx.git
  • 正常提交命令

    1
    2
    3
    4
    5
    git status
    git pull origin master
    git add .
    git commit -am '提交信息'
    git push origin master
  • 缓存某些修改的文件

    1
    git stash
  • 恢复缓存的文件

    1
    git pop
  • 获取某个分支/恢复某个文件

    1
    git checkout branchX/file_path
  • 撤销某次修改

    1
    git revert HEAD
  • 回退到某个版本

    1
    git reset --hard HEAD | git reset --hard origin/master
  • 可以在你的仓库根目录中添加一个叫”.gitignore”的文件,来告诉Git系统要忽略 掉哪些文件,下面是文件内容的示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 以'#' 开始的行,被视为注释.
    # 忽略掉所有文件名是 foo.txt 的文件.
    foo.txt
    # 忽略所有生成的 html 文件,
    *.html
    # foo.html是手工维护的,所以例外.
    !foo.html
    # 忽略所有.o 和 .a文件.
    *.[oa]
  • 删除 untracked files

    1
    git clean -f
  • 连 untracked 的目录也一起删掉

    1
    git clean -fd
  • 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)

    1
    git clean -xfd
  • 在用上述 git clean 前,强烈建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删

    1
    2
    3
    git clean -nxfd
    git clean -nf
    git clean -nfd
  • 内建的图形化 git

    1
    gitk

More info

git-scm.com

常用 Git 命令清单 - 阮一峰

GIT永久删除commit

如何在 Git 里撤销(几乎)任何操作

开源项目的那点事

今天晚上在体育街打乒乓球,偶遇一退休乒乓球教练,他在看到洒家打球的时候,一针见血的指出了我的陋习,他说:因地球引力的存在,地球上的一切运动都是抛物线型的,在运动的时候身体的重心要放低,像扎马步那样最好,球拍和桌沿平行,击球时,运用肘部的力量,快速直线摆动小臂,球拍从腰部快速摆到鼻子部分,给球一个向上向前的力,不要做多余的动作,尤其是动腿的陋习必须改掉。

洒家对老爷爷的说法深以为然,其实运动大道理是相通的,都是重心放低,做好扎马步的姿势,这样可以快速的进行身体姿势的变换,以应对即将到来的变化。运动时要运用相关关节的力量,快速带动关节相关身体部位向上前方向击出,不要做多余的动作。(陋习:打球时完全不需要动脚…… 囧)

为了改变运动陋习,特作此文,已备翻阅。

前言

如何保证API的client来源是真实的,对于API的认证很重要,平时都是按别人的文档和别人通讯也没想过这事,一想还蛮有趣的,下面就让我们来一步步规划一个接口认证的吧。

信息匹对

认证不就是登陆么,用户给我发个身份和密码,我一匹对,正确,通过不久可以了么?

方法

用户发一个 user_id 和 user_key 过来,我们接收后匹对看是否存在。

不足

接口通过HTTP通讯,中间一旦被人窃听,以后就可以拿 user_id 和 user_key 给我们发请求,而我们无法分辨出到底是谁才是真的齐天大圣。看来,不可以把 user_key 这样子发送。

就算认证是可靠的,黑客还是可以拦截住请求,对认证部分不修改但把参数修改了,然后让请求继续发送。例如把你准备给哈利文转账,但是请求在中间被拦截修改后,变成给变色龙转了。

哈希

我们密码存储的时候不是经常md5哈希后保存么,那么我们把 user_key 也哈希一下吧,嗯,正愁不知道拿user_key和谁哈希好,既然说参数会被替换,那么,我们拿 user_key 和 请求参数哈希后的字符串作为 auth_token 传输,而不发送 user_key不就可以了。这样参数也成为认证的一部分,就不会被替换掉了。

做法

把参数按某个规则排好序后,连接成字符串,然后和 user_key 哈希后作为 auth_token,发送。接受端接到请求后,把参数排序后和 user_key 哈希后的字符串和 auth_token 比较。

不足

当参数很少,而 user_key 不复杂的情况下, auto_token 有被碰撞出 user_key的可能

加强版哈希

表示,这种情况对我们这种平时存密码都要多次哈希的孩子来说毫无鸭梨啊,我们可以分别对参数字符串哈希后取一定位数,然后把 user_key 哈希后取一定位数,再把两者连起来哈希作为 auth_token

请求非法 !

什么转了9999次款?黑客大叔表示无法对我们请求下手了,不过他借你某次给他转款的时候拦截到了你的请求,然后不停的伪造一样的请求… 我们可以增加一些策略,防止这种请求重放,例如:在参数里面添加时间戳,最好精确到毫秒,然后把时间戳、user_id和接口方法作为唯一值检验,相同的值只能一次有效。

不足

目前为止,我们能确保请求时持有user_key的user_id发出的,而且不会被修改,不会被重放,user_key也不会暴露,一切都很美好。但是我们的信息是明文的,会照成信息泄露。

加密

可以把内容加密起来传输

方法

HTTPS  
RSA  
利用user_key对整个请求的内容进行异或后重新编码之类的加密

不足

成本高,操作麻烦,目前普通接口通讯一般不会有到这一步的处理。

这是双向的

认证是接口双方都需要做的,不止指用户发给平台,还要包括用户接到平台应答后也应该进行相同的验证

其他手段

ip地址认证
请求有效时间

总之

来源正确,身份正确,内容正确,请求正确,信息安全

介绍

SSDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下, 作为Redis的替代方案.

因为SSDB的最初目的是替代Redis, 所以SSDB会经常和Redis进行比较. 我们知道, Redis是经常的”主-从”架构, 虽然可以得到负载均衡以及数据跨地域备份的功能, 但无法实现高可用性. 考虑这种情况, Redis的主和从分别在两个IDC机房, 当主所在的机房出现故障时, 整个服务其实就相当于停止了. 因为所有写操作都失败, 而应用一般不会实现自动降级服务.

而SSDB支持”双主”架构(SSDB分布式架构: https://github.com/ideawu/ssdb/wiki/Replication), 两个或者更多的主服务器. 当其中一部分出现故障时, 剩余的主服务器仍然能正常接受写请求, 从而保证服务正常可用, 再将DNS解析修改之后, 就能在机房故障后立即恢复100%可用.

SSDB 被开发和开源出来后, 已经在生产环境经受了3个季度的考验,SSDB最先在”IT牛人博客聚合网站“进行尝试应用, 接着在360游戏部门得到大规模应用, 目前支撑的数据量已经达到数百G. 这些应用最初是使用Redis的, 迁移到SSDB的成本非常低, 涉及的代码改动极小.

使用

安装

SSDB 的建议安装方式是源码编译安装, 建议运行环境是主流 Linux 发行版. 远程 SSH 登录你的服务器, 然后⽤用下⾯面的命令下载、编译、安装和运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[sphenginx@~]$ sudo wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
[sphenginx@~]$ sudo unzip master
[sphenginx@~]$ cd ssdb-master
[sphenginx@~]$ sudo make
[sphenginx@~]$ #optional, install ssdb in /usr/local/ssdb
[sphenginx@~]$ sudo make install
# start master
[sphenginx@~]$ sudo ./ssdb-server ssdb.conf
# or start as daemon
[sphenginx@~]$ sudo ./ssdb-server -d ssdb.conf
# ssdb command line
[sphenginx@~]$ sudo ./ssdb-cli -p 8888
# stop ssdb-server
[sphenginx@~]$ sudo kill `cat ./var/ssdb.pid`

SSDB 默认安装在 /usr/local/ssdb 目录下. ssdb-server 是服务器的程序, ssdb-cli 是命令行客户端.

配置

SSDB配置文件: http://www.ideawu.net/blog/archives/733.html

SSDB 附带的 ssdb.conf 你不用修改便可以使用. 如果你要高度定制, 还是需要修改一些配置的. 下面做介绍. SSDB 的配置文件是一种层级 key-value 的静态配置文件, 通过一个 TAB 缩进来表示层级关系. 以 ‘#’ 号开始的行是注释. 标准的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# ssdb-server config 
# MUST indent by TAB!

# relative to path of this file, directory must exists
work_dir = ./var
pidfile = ./var/ssdb.pid

server:
ip: 127.0.0.1
port: 8888
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168

replication:
slaveof:
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#ip: 127.0.0.1
#port: 8889

logger:
level: info
output: log.txt
rotate:
size: 1000000000

leveldb:
# in MB
cache_size: 500
# in KB
block_size: 32
# in MB
write_buffer_size: 64
# in MB
compaction_speed: 1000
# yes|no
compression: no

work_dir: ssdb-server 的工作目录, 启动后, 会在这个目录下生成 data 和 meta 两个目录, 用来保存 LevelDB 的数据库文件. 这个目录是相对于 ssdb.conf 的相对路径, 也可以指定绝对路径.

server: ip 和 port 指定了服务器要监听的 IP 和端口号. 如果 ip 是 0.0.0.0, 则表示绑定所有的 IP. 基于安全考虑, 可以将 ip 设置为 127.0.0.1, 这样, 只有本机可以访问了. 如果要做更严格的更多的网络安全限制, 就需要依赖操作系统的 iptables.

replication: 用于指定主从同步复制. slaveof.ip, slaveof.port 表示, 本台 SSDB 服务器将从这个目标机上同步数据(也即这个配置文件对应的服务器是 slave). 你可以参考 ssdb_slave.conf 的配制.

logger: 配置日志记录. level 是日志的级别, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志轮转, 在日志文件达到一定大小后, 将 log.txt 改名, 然后创建一个新的 log.txt.

leveldb: 配置 LevelDB 的参数. 你一般想要修改的是 cache_size 参数, 用于指定缓存大小. 适当的缓存可以提高读性能, 但是过大的缓存会影响写性能.

使用

在使用自带的 ssdb.conf 配置文件时, SSDB 生成的日志文件按体积进行分割, 仅此而已. 所以, 你需要编写自己的 crontab 进行日志压缩和定期清理.
如果出现服务器掉电, kernel panic 等系统故障, 在系统重新启动之后, 你需要⼿手动删除 ssdb的 PID 文件 ssdb.pid, 然后才能启动 ssdb-server.另外, 你可以参考下面的做法, 在系统启动和关机时, 启动和关闭 ssdb-server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# /bin/sh 
#
# chkconfig:345 98 98
# description: SSDB is a fast NoSQL database for storing big list of billions of elements
# processname:ssdb

case "$1" in
'start')
/usr/local/ssdb/ssdb-server -d /usr/local/ssdb/ssdb.conf
echo "ssdb started."
;;
'stop')
kill `cat /usr/local/ssdb/var/ssdb.pid`
echo "ssdb stopped."
;;
'restart')
kill `cat /usr/local/ssdb/var/ssdb.pid`
echo "ssdb stopped."
sleep 0.5
/usr/local/ssdb/ssdb-server -d /usr/local/ssdb/
ssdb.conf
echo "ssdb started."
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0

把文件保存为 /etc/init.d/ssdb.sh(需要 root 权限), 然后执行:

1
[sphenginx@~]$ chmod ugo+x /etc/init.d/ssdb.sh

把 ssdb加入chkconfig,并设置开机启动。

1
2
[sphenginx@~]$ sudo chkconfig --add ssdb.sh 
[sphenginx@~]$ chkconfig ssdb.sh on

启动、停止的命令如下:

1
2
3
4
5
6
[sphenginx@~]$ sudo service ssdb.sh stop 
ssdb stopped.
[sphenginx@~]$ sudo service ssdb.sh start
ssdb 1.6.7
Copyright (c) 2012-2013 ideawu.com
ssdb started.

Win platform

项目代码中已经加入PHP 的api,API地址:http://ssdb.io/docs/zh_cn/php/index.html
也可以安装一下SSDB的管理软件:PSA
另外, SSDB 提供了预编译的 Windows 下的可执行安装包, Windows 用户可以下载后直接运行 ssdb-server.exe. Windows 下的 SSDB 依赖 cygwin, 所以附带了几个 dll 文件. 使用方式:

  1. https://github.com/ideawu/ssdb-bin 下载可执行文件 ssdb-server.exe 和相关 dll.
  2. https://github.com/ideawu/ssdb 下载 ssdb.conf 配置文件.
  3. 解压, 然后从开始菜单中运行 cmd.exe.
  4. 在 cmd.exe 启动后, cd ssdb-server.exe 所在的目录.
  5. 执行 ssdb-server.exe ssdb.conf

More info

SSDB开源数据库项目地址: https://github.com/ideawu/ssdb
作者博客地址: http://www.ideawu.net/blog/ssdb