分类 代码分析 下的文章

使用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

    然后输入SublimeC,选择SublimeCodeIntel进行安装。

    SublimeCodeIntel

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

    SublimeCodeIntel安装

  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,点击某个函数,会看到下面这个提示。

    建立索引

  3. 尽情使用吧

    按住alt,点击某个函数会跳转到具体方法。
    写代码的时候,会提示某个类下的所有方法。

    SublimeCodeIntel提示

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

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