MongoDB跟PostgreSql的对比

最近把一个业务项目从MongoDB切换到了PostgreSql上。

下面是切换前后的效果。

  1. 存储大小

    MongoDB

    PostgreSql

    上图为MongoDB,下图为PostgreSql。

    因为MongoDB会把json的每个字段都做索引,所以它占用的空间要比PostgreSql大的多。

  2. web请求耗时

    MongoDB

    PostgreSql

    上图为MongoDB,下图为PostgreSql。

    MongoDB的平均耗时在10ms左右,PostgreSql的平均耗时在20ms左右。
    因为PostgreSql规划了表结构,每一次请求是要查多个表的,而MongoDB只需要查一个表。

Sublime Text3下配置SublimeLinter进行PHP代码检查

SublimeLinter 是前端编码利器——Sublime Text 的一款插件,用于高亮提示用户编写的代码中存在的不规范和错误的写法,支持 JavaScript、CSS、HTML、Java、PHP、Python、Ruby 等十多种开发语言。

  1. 安装SublimeLinter

    在Sublime Text3下同时按住ctrl+shift+p,然后输入install,选择Install Package

    Install Package

    然后输入sublimelinter,选择SublimeLinter进行安装。

    SublimeLinter

    安装完成后,会看到如下的说明。

    SublimeLinter安装

  2. 安装SublimeLinter-php

    SublimeLinter-php使用的是php -l 进行的检查。
    This linter plugin for SublimeLinter provides an interface to php -l. It will be used with files that have the “PHP”, “HTML”, or “HTML 5” syntax.

    在Sublime Text3下同时按住ctrl+shift+p,然后输入install,选择Install Package

    Install Package

    然后输入sublimelinter-php,选择SublimeLinter-php进行安装。

    SublimeLinter-php

  3. 配置SublimeLinter

    打开SublimeLinter的配置文件,依次点击Preferences->Package Settings->SublimeLinter->Settings - User。

    在打开的配置文件里,搜索paths,找到下面的windows,配置php的绝对路径。

    配置SublimeLinter

    其中的lint_mode,表示运行模式,可选的值有background, load/save, save only, 和 manual,这里我设置为了save only,只有才保存时才进行检查。
    其中的mark_style,表示出错的显示样式,可选的值有"fill", "outline", "solid underline", "squiggly underline", "stippled underline", 和 "none",默认值为outline,出错的情况显示如下。

    出错显示

PHP跟JS位移操作的区别

JS代码

console.log(193449512 << 5);

输出结果

JS执行结果

PHP代码

echo 193449512 << 5;echo "\n";

输出结果

PHP执行结果

为什么结果会不一样呢?首先怀疑的是PHP的位数是不是32位导致的,看了下PHP信息排除了。

搜索了一番信息,才找到原因。

js 在进行二进制运算时,使用 32 位二进制整数。

而我本机的PHP是64位,所以导致两种运算的结果不一致。

解决方法:

$a = 193449512;
$bin = decbin($a);
$bin = str_pad($bin, 32, '0', STR_PAD_LEFT);

echo bindec(str_pad(substr($bin, 5), 32, '0', STR_PAD_RIGHT));
echo "\n";

// output 1895417088

重新编译PHP7支持PostgreSQL

安装PostgreSQL

apt-get install postgresql postgresql-contrib postgresql-server-dev-9.3 libpq-dev

编译PHP增加PostgreSQL扩展

  1. 先看下之前编译的configure命令。

        php -i | grep configure
    
  2. 配置编译参数。在上面的configure命令后面加上--with-pdo-pgsql选项。

    ./configure --prefix=/usr/local/php7 --exec-prefix=/usr/local/php7 --bindir=/usr/local/php7/bin --sbindir=/usr/local/php7/sbin --includedir=/usr/local/php7/include --libdir=/usr/local/php7/lib/php --mandir=/usr/local/php7/php/man --with-config-file-path=/usr/local/php7/etc --with-mysql-sock=/var/run/mysql/mysql.sock --with-mcrypt=/usr/include --with-mhash --with-openssl --with-mysqli=shared,mysqlnd --with-pdo-mysql=shared,mysqlnd --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-gd-native-ttf --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --with-fpm-user=www --with-fpm-group=www --without-gdbm --disable-fileinfo --with-pdo-pgsql=/usr/lib/postgresql/9.3
    
  3. 开始编译和安装。

    make && make install
    
  4. 安装完成后,检查PHP扩展。

    php -m | grep pdo_pgsql
    

    输出里有pdo_pgsql,就表示PostgreSQL的扩展ok了。

使用SimpleXML输出rss内容

代码说话。

    header('Content-Type: application/xml', true); //set document header content type to be XML

    $rss = new SimpleXMLExtendedModel('<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"></rss>');
    $rss->addAttribute('version', '2.0');

    $channel = $rss->addChild('channel'); //add channel node

    $atom = $channel->addChild('atom:atom:link');
    $atom->addAttribute('href', '你的RSS链接');
    $atom->addAttribute('rel', 'self');
    $atom->addAttribute('type', 'application/rss+xml');

    $channel->addChild('title', 'RSS标题');
    $description = $channel->addChild('description', 'RSS描述');
    $link = $channel->addChild('link', '你的RSS链接');
    $language = $channel->addChild('language', 'zh-Hans');

    $lastBuildDate = new DateTime($date . ' 02:00:00');
    $channel->addChild('lastBuildDate', $lastBuildDate->format(DateTime::RSS));
    $channel->addChild('pubDate', $lastBuildDate->format(DateTime::RSS));

    $generator = $channel->addChild('generator', '创建者');

    // $result 为数据库查询结果
    foreach ($result as $data) {

        $item = $channel->addChild('item');
        $item->addChild('title', 'item的标题');
        $link = $item->addChild('link', 'item的链接');
        $guid = $item->addChild('guid', 'item的链接');
        $guid->addAttribute('isPermaLink', 'true');

        $item->addChild('description')->addCData('item的描述');

        $item = $item->addChild('pubDate', $lastBuildDate->format(DateTime::RSS)); //add pubDate node
    }

    echo $rss->asXML();

期间遇到CDATA的问题,解决方案新增一个扩展类。

class SimpleXMLExtendedModel extends SimpleXMLElement {

    public function addCData($cdata_text) {

        $node= dom_import_simplexml($this);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($cdata_text));

        return true;
    }
}