使用PHP的ProtoBuf扩展

扩展使用的是allegro/php-protobuf,地址见github.

  1. 下载源码。
  2. 编译安装。
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install
  1. 执行下面的命令,生成对应的PHP类文件。
    /usr/local/php/bin/php ./protoc-gen-php.php ./qcloud_notify.protofg

在第三步生成文件时,遇到下面的错误。

  1. Unable to find the protoc command.的错误。

    解决办法:
    1. 下载protobuf源码。(allegro/php-protobuf要求protobuf版本最低为2.6,我下载的2.6版本)
    2. 编译安装。
    sh ./autogen.sh
    ./configure
    make && make install
  1. 提示ERROR: protoc exited with an exit status when executed with

    解决办法:
    编辑`src/Allegro/Protobuf/Compiler/Compiler.php`文件.
    找到148行`if ($return !== 0) {`,改为`if ($return != 0) {`即可。

使用rsync同步文件

背景

1. 在开发机上远程开发,svn提交代码
2. 开发过程中,需要同步代码到测试机上进行测试。测试机出于安全考虑,不允许连接svn。

我之前是直接使用scp批量同步所有文件到测试机,现在安全策略收紧,不允许使用scp了。
咨询了运维,可以搭建rsync来进行机器间的文件同步。

这里假设有两台机器:开发机10.0.0.1和测试机10.0.0.2。

1. 在两台机器上搭建rsync。

下载rsyncd

tar -zvf rsync-3.1.2.tar.gz
cd rsync-3.1.2
./configure --prefix=/usr/local/rsync
make
make install

下面的配置文件只需要在测试机上添加。

/etc/rsyncd.conf 指定rsync的配置

#以什么身份运行rsync
uid = root
gid = root
use chroot = no
#同时连接的最大连接数,0则不限制
max connections=0
#日志格式%h远端的主机名,%o操作类型,send/recv,%f文件名,%l文件长度,单位byte,%b真实传输的字节数
log format = %h %o %f %l %b 
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock

#模块名
[test]
#同步的文件目录
path = /data/web/test
#欢迎信息
comment = rsync from other
#只读
read only = no
#允许拉取文件列表
list = on
#secrets file中的用户名
auth users = rsyncuser
#密码文件位置
secrets file = /etc/rsync.pas

/etc/rsync.pas为允许访问的用户密码列表

rsyncuser:123456

这里记得添加完rsync.pas文件后,修改下文件属性。

chmod 600 /etc/rsync.pas

启动测试机上的rsync进程。

kill -9 $(pidof rsync)
rm -f /var/run/rsyncd.pid
/usr/bin/rsync --port=8730 --address=10.0.0.2 --daemon

2. 在开发机上同步文件

执行同步命令。

rsync -azv --delete --port=8730 /data/image/v2.0.2/ rsyncuser@10.0.0.2::test

输入密码,然后就能看到同步的文件列表了。

这里我们同步的时候,需要把.svn.swp等其他隐藏目录文件排除掉的。

新建文件exclude.list文件,里面每一行一个需要排除的文件。

.*

同时我们也不想每次输入密码,新建文件rsync_client.pas,内容为同步用户的密码,注意这个为明文。

123456

修改rsync_client.pas文件权限和属主,这里需要把属主改为执行同步的用户,否则会报权限不足的错误。

chown dondon:users rsync_client.pas
chmod 600 rsync_client.pas

执行同步命令。

/usr/local/rsync/bin/rsync -azv --delete --port=8730 /data/image/v2.0.2/ rsyncuser@10.0.0.2::test --exclude-from=/usr/local/rsync/exclude.list --password-file=/usr/local/rsync/rsync_client.pas

之前使用scp同步文件,有一个缺点,svn里删除的文件,测试机上是不会删除的。
但是rsync就可以同步所有文件的状态,包括已删除的。
这里建议把重启rsync和同步文件的命令写成shell,添加到alias里,这样每次就不需要写这么长的命令了。

abc:~/image/v2.0.2> syncfile ./
sending incremental file list
deleting test.txt
./
web/index.php

sent 23519 bytes  received 238 bytes  47514.00 bytes/sec
total size is 5923997  speedup is 249.36

Sublime Text3下SublimeCodeIntel的使用

SublimeCodeIntel是sublime text下的一款代码提示插件。

  1. 安装SublimeCodeIntel

    在Sublime Text3下同时按住`ctrl+shift+p`,然后输入`install`,选择`Install Package`。
    
    ![Install Package](http://ww2.sinaimg.cn/large/63c9befagw1f59rzbqew9j20ch03it91.jpg)
    
    然后输入`SublimeC`,选择`SublimeCodeIntel`进行安装。
    
    ![SublimeCodeIntel](http://ww4.sinaimg.cn/large/63c9befagw1f5d37rot1cj20c50bgwh0.jpg)
    
    安装完成后,会看到如下的说明。
    
    ![SublimeCodeIntel安装](http://ww4.sinaimg.cn/large/63c9befagw1f5d389avh3j20x40mj7ct.jpg)
    
  2. 配置SublimeCodeIntel

    打开`SublimeCodeIntel`的配置文件,依次点击`Preferences->Package Settings->SublimeCodeIntel->Settings - User`。
    
    安装完成后,默认`User`的配置文件为空,需要从`Default`下拷贝过来。`Default`配置文件,依次点击`Preferences->Package Settings->SublimeCodeIntel->Settings - Default`。
    
    搜索`PHP`,找到形如下面的代码。
    
    "PHP": {
        "php": "/Applications/MAMP/bin/php/php5.5.3/bin/php",
        "codeintel_scan_extra_dir": [],
        "codeintel_scan_files_in_project": true,
        "codeintel_max_recursive_dir_depth": 15,
        "codeintel_scan_exclude_dir":["/Applications/MAMP/bin/php/php5.5.3/"]
    }
修改`php`后面的值为你的PHP路径,windows下的话需要使用`/`替换`\`。
修改`codeintel_scan_extra_dir`后面的值为你的项目路径,代码提示、跳转的索引会在这个路径下去建立。

下面是我修改后的配置。
"PHP": {
    "php": "C:/xampp/php/php.exe",
    "codeintel_scan_extra_dir": ["E:/svn/image/trunk"],
    "codeintel_scan_files_in_project": true,
    "codeintel_max_recursive_dir_depth": 15,
    "codeintel_scan_exclude_dir":["C:/xampp/php"]
}
修改完后,重启Sublime Text程序,它会在后台创建索引。这个时候你按住`alt`,点击某个函数,会看到下面这个提示。

![建立索引](http://ww3.sinaimg.cn/large/63c9befagw1f5d3mfhq5oj20gu011glz.jpg)
  1. 尽情使用吧

    按住`alt`,点击某个函数会跳转到具体方法。
    写代码的时候,会提示某个类下的所有方法。
    
    ![SublimeCodeIntel提示](http://ww4.sinaimg.cn/large/63c9befagw1f5d3pf0b8mj20l30b140r.jpg)
    

我个人感觉sublime text自带的代码提示就够了。

MongoDB跟PostgreSql的对比

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

下面是切换前后的效果。

  1. 存储大小

    ![MongoDB](http://ww1.sinaimg.cn/large/63c9befagw1f5axwcyyvrj205a01imx9.jpg)
    
    ![PostgreSql](http://ww4.sinaimg.cn/large/63c9befagw1f5axyb9jcbj206901gwef.jpg)
    
    上图为MongoDB,下图为PostgreSql。
    
    因为MongoDB会把json的每个字段都做索引,所以它占用的空间要比PostgreSql大的多。
    
  2. web请求耗时

    ![MongoDB](http://ww3.sinaimg.cn/large/63c9befagw1f5ay0fl3yxj20fo05h74q.jpg)
    
    ![PostgreSql](http://ww2.sinaimg.cn/large/63c9befagw1f5ay0mlenej20fn05j74r.jpg)
    
    上图为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](http://ww2.sinaimg.cn/large/63c9befagw1f59rzbqew9j20ch03it91.jpg)
    
    然后输入`sublimelinter`,选择`SublimeLinter`进行安装。
    
    ![SublimeLinter](http://ww1.sinaimg.cn/large/63c9befagw1f59rze8e55j20c60b9413.jpg)
    
    安装完成后,会看到如下的说明。
    
    ![SublimeLinter安装](http://ww1.sinaimg.cn/large/63c9befagw1f59s24y47mj20up0if437.jpg)
    
  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](http://ww2.sinaimg.cn/large/63c9befagw1f59rzbqew9j20ch03it91.jpg)
    
    然后输入`sublimelinter-php`,选择`SublimeLinter-php`进行安装。
    
    ![SublimeLinter-php](http://ww3.sinaimg.cn/large/63c9befagw1f59s3slow5j20c90bg0vc.jpg)
    
  3. 配置SublimeLinter

    打开`SublimeLinter`的配置文件,依次点击Preferences->Package Settings->SublimeLinter->Settings - User。
    
    在打开的配置文件里,搜索`paths`,找到下面的`windows`,配置php的绝对路径。
    
    ![配置SublimeLinter](http://ww3.sinaimg.cn/large/63c9befagw1f59s8l1u1kj20y80ljaf0.jpg)
    
    其中的`lint_mode`,表示运行模式,可选的值有`background`, `load/save`, `save only`, 和 `manual`,这里我设置为了`save only`,只有才保存时才进行检查。
    其中的`mark_style`,表示出错的显示样式,可选的值有`"fill"`, `"outline"`, `"solid underline"`, `"squiggly underline"`, `"stippled underline"`, 和 `"none"`,默认值为`outline`,出错的情况显示如下。
    
    ![出错显示](http://ww3.sinaimg.cn/large/63c9befagw1f59sgj1hywj207m043q2v.jpg)