truncate和delete之间有什么区别

TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。
TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

TRUNCATE,DELETE,DROP放在一起比较:

操作 区别
TRUNCATE TABLE 删除内容、释放空间但不删除定义。
DELETE TABLE 删除内容不删除定义,不释放空间。
DROP TABLE 删除内容和定义,释放空间。

基于crc32的短网址算法

记得2012年微博刚火起来的时候,由于微博内容有字数限制,所以推出了一个叫“短网址”的概念,这么多年过去了,微博快挂了,但是短网址依然被被网络推广者喜爱。
也在2012的时候有研究过类似的算法,有写过一篇《微博短链接算法php版本》,但是当时的两个版本是基于md5分段实现,碰撞率都很高,所以一直没敢用在项目中。
偶然一次机会在php手册里看到一个叫crc32的函数(这通常用于检查传输的数据是否完整),基于这个函数,手册中也有一个类似短网址的算法,源码如下:

function khash($data){
    $map        = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    $hash       = bcadd(sprintf('%u',crc32($data)) , 0x100000000);
    $str        = "";
    do {
        $str    = $map[bcmod($hash, 62)] . $str;
        $hash   = bcdiv($hash, 62);
    } while ($hash >= 1);
    return $str;
}

简单的测试了一下碰撞率:

$sids       = array();
$repeats    = array();
$result     = array();
for($i=1; $i<=100000; $i++){
    $url    = "http://www.hdj.me/?id=".md5($i);
    $sid    = shorurl($url);
    // echo $sid."\n";
    if(in_array($sid, $sids)){
        $repeats[]  = $sid;
    }
    $sids[]         = $sid;
    $result[$sid][] = $url;
}
foreach((array)$repeats as $sid){
    var_dump($result[$sid]);
}

测试结果:
10000个循环内未出现碰撞;
100000个循环仅出现1个碰撞;

nginx与fastcgi分离实现开发环境统一

一 背景介绍
由于公司的工程师,每个人都有一套自己的开发环境,php版本不一致,扩展也不统一,在开发的时候很容易出现问题。

二 思考
通过nginx与fastcgi分离,让所有人都使用同一个php环境,实现环境统一。

三 准备
开发环境(windows 192.168.8.119)
fastcgi环境(linux 192.168.8.25)

四 目录挂载
# mount 本地目录至fastcgi所在服务器
# mount 用户使用nobody,保证有足够的权限 uid=99,gid=99

# 挂载
mount -t cifs -o username="[windows用户名]",password="[windows登入密码]",uid=99,gid=99 //192.168.8.119/www /mnt/192.168.8.119/www
# 解除挂载
umount /mnt/192.168.8.119/www

五 Nginx配置
# fastcgi配置

server {
    listen      80;
    server_name localhost 127.0.0.1;
    index       index.html index.htm index.php;
    root        "D:/wamp/www";

    location ~ \.php($|/) {
        fastcgi_pass    192.168.8.25:9000; # fastcgi服务器,注意要保护9000端口哦!
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  /mnt/192.168.8.119/www$fastcgi_script_name; # 注意要配置fastcgi所在服务器路径
        include         fastcgi_params;
    }

    error_log   nul;
    access_log  nul;
}

六 题外话
很多大牛也通过这样实现动静分离。