于 PHP 安装使用 Google LevelDB extension

LevelDB (leveldb – a fast and lightweight key/value database library) 是 Google 开发非常快速的 key-value 储存的函式库, 效能看起来相当不错: LevelDB Benchmarks, 且 LevelDB 的资料, 都会经过 Snappy 压缩, 所以资料也会比较小.

注: 下述安装环境为 Debian / Ubuntu Linux

于 PHP 增加 Google LevelDB 的 Extension

有 LevelDB 的 Source code, 再来找 PHP 的 ext 是否有人写, 于是就找到: leveldb for php

也正好找到此篇有人已经有做过编译: 从原始码编译 Google LevelDb 的 PHP 扩展, 下述步骤摘录自此篇.

安装、编译步骤
  1. BUILD=/usr/local/
  2. # 编译安装 LevelDB
  3. svn export http://leveldb.googlecode.com/svn/trunk/ leveldb
  4. cd $BUILD/leveldb
  5. make -j8 OPT=”-O2 -DNDEBUG -fPIC”
  6. # 编译安装 php-leveldb ext
  7. git clone git://github.com/arraypad/php-leveldb.git
  8. cd $BUILD/php-leveldb
  9. phpize
  10. ./configure –with-leveldb=$BUILD/leveldb
  11. make -j8
  12. make test
  13. make install
  14. # 于 Apache 的 PHP 设定 leveldb.so (extenstion)
  15. vim /etc/php5/cli/conf.d/leveldb.ini # 内容如下述
    extension=leveldb.so
  16. /etc/init.d/apache2 restart # 到此就可以开始使用 LevelDB 囉~

LevelDB 于 PHP 的操作与使用范例

范例可于 php-leveldb 的 tests 里面找到: basic.phpt (下述参考整理自此档案)

范例
<?php
if (!extension_loaded('leveldb')) {
    die('skip leveldb not loaded');
}

$path = '/tmp/leveldb.test';
$db = new LevelDb($path);

echo "* setting (foo=bar): \n";
var_dump($db->set('foo', 'bar')); // bool(true)

echo "* getting (foo): \n";
var_dump($db->get('foo')); // string(3) "bar"

echo "* delete (foo): \n";
var_dump($db->delete('foo')); // bool(true)

echo "* getting (foo): \n";
var_dump($db->get('foo')); // bool(false)
?>

beanstalkd 消息队列的第一手资料

beanstalk 消息队列 小结
协议说明和各状态转换情况

基本知识点:
1. 对于beanstalk 消息队列中每条数据都为 job
2. beanstalk service端 ,会维护 tubes[多个管道]
3. client端可以监听,使用多 tube
4. client端可以指定 use 管道[ client生成一个新的job时会把此job提交到 指定管道]
5. client端可以指定 watch 管道 [ client接收处理job时会到 指定管道得到待处理的job]

官方示意图:
put reserve delete
—–> [READY] ———> [RESERVED] ——–> *poof*

一般情况:
1. 任务提交到service端,job 管理放入内存空间并为其标记状态 [READY]
2. client通过轮训竞争得到次状态, job 改为 [RESERVED]
2.1 当在默认时间 120 秒内没处理完 , job.stats.timeouts 就会大于 0
同时其他 轮训竞争client会拿到这个job【 注意了 每次timeouts时,在轮训的客户端就会得到次job,状态都为 ready,timeouts>0 】
3. 随便其中一台client处理完 job.delete , 其他 client 中的此job 都会 *poof*

deom – python beanstalkc 中 job.stats 参考:
使用 easy_install beanstalkc
API 参考 : http://github.com/earl/beanstalkc/blob/master/TUTORIAL
刚生成的 beanstalk
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 6, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 114,
‘kicks’: 0, ‘id’: 2}

以timeout了的 beanstalk,并且在其他client轮训到 job
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 110,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 1, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

当没所有client 的 job 都到期 了 状态
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120,
‘age’: 417, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967161L,
‘kicks’: 0, ‘id’: 2}
{‘buries’: 0, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 2, ‘ttr’: 120, ‘age’: 415,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘ready’, ‘time-left’: 4294967163L,
‘kicks’: 0, ‘id’: 2}

其中 client1 job.delete
client1 job.stats *poof*
client2 job.stats *poof*

比较全的状态说明 – [官方文档]
http://github.com/kr/beanstalkd/blob/v1.1/doc/protocol.txt?raw=true

官方示意图:

先简单说明下(完全自己理解的,欢迎拍砖。本人E人太差~看官档费劲,谅解下):
job.stats状态 = [READY] 待处理, [RESERVED] 正处理, [DELAYED]延迟状态 , [BURIED] 隐藏状态

1. 延迟提交
py.client1.put>>> beanstalk.put(‘yes!’, delay=10)
py.client3.reserve>>> job = beanstalk.reserve()
# 等待 10 秒

2. 管道测试
put-job到service端 可以指定 put的tube管道
如:

py.client1.put>>> beanstalk.use(‘foo’)
py.client1.put>>> beanstalk.put(‘hey!’)

py.client2.reserve>>> job = beanstalk.reserve()
# 一直拥塞,应为 他 watch 管道 ‘default’

py.client3.reserve>>> beanstalk.watch(‘foo’)
# beanstalk.ignore(‘bar’) 放弃监听 bar
py.client3.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job.body #输出 ‘hey!’

3. 隐藏状态 现在吧 client 1/2/3 的 use watch 的管道都调回 default
py.client2.reserve>>> job = beanstalk.reserve()
py.client3.reserve>>> job = beanstalk.reserve()
py.client1.put>>> beanstalk.put(‘隐藏状态!’)
py.client2.reserve>>> job.bury() #2 轮训得到 并且 修改 job 为隐藏状态
# 120 秒后 client3 没有轮训得到 此job
py.client2.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120,
‘age’: 188, ‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘buried’,
‘time-left’: 4294967228L, ‘kicks’: 0, ‘id’: 11}
py.client2.reserve>>> beanstalk.kick( job.stats()[‘id’] ) #修改状态为 reserved
# 立刻 client3 得到 job
py.client3.reserve>>> job.stats()
{‘buries’: 1, ‘releases’: 0, ‘tube’: ‘default’, ‘timeouts’: 0, ‘ttr’: 120, ‘age’: 313,
‘pri’: 2147483648L, ‘delay’: 0, ‘state’: ‘reserved’,
‘time-left’: 110, ‘kicks’: 1, ‘id’: 11}
# 这时候 client2 / 3 同时 有 job 11 状态 ‘buries’: 1,’timeouts’: 0,’state’: ‘reserved’

4. peek 窥见
可以得到 一个 stats – read 的 job ,其他 client 可以 job = beanstalk.reserve()
后马上 job.stats 会变成 [RESERVED]
py.client2.reserve>>> job = beanstalk.peek_ready()
取得 job 并看 本 client 能 处理能
>>> job = beanstalk.peek(3)
>>> job.body
‘yes!’
>>> job.stats()[‘state’]
‘ready’
这种形式西 job 不能 bury 等修改状态,但 可以 delete

peek 系类
peek_buried
peek_ready

linux tar分卷压缩方法

linux下备份网站数据,由于文件很多,打包成一个文件会比较大,所以想分卷压缩成每个900M的文件,方便下载与上传到网盘备份。

1.分卷压缩,使用tar+split组合
进入网站目录,执行:
tar cvzf – web| split -b 900m

2.合并
cat x* > web.tar.gz

3.解压
tar xvzf web.tar.gz

一年一度的回家过大年的行动就要开始了

元旦加班,第二天也就是2号,起个大早,打开电脑准备秒杀回家火车票!
12306不给力,登了十多分钟才登上去,十点杭州放票,快十点半了票都没刷出来,等不了了,直接电话95105105,一打就通。然后屁颠屁颠得跑到城站火车站取票。

随便在火车站附近找了个小店吃饭。小店的水煮鱼非常给力!

13号的票,也就是这周五了。开始想念妈妈做的菜了····

Memcache的问题集

o memcached是怎么工作的?
o memcached最大的优势是什么?
o memcached和MySQL的query cache相比,有什么优缺点?
o memcached和服务器的local cache(比如PHP的APC、mmap文件等)相比,有什么优缺点?
o memcached的cache机制是怎样的?
o memcached如何实现冗余机制?
o memcached如何处理容错的?
o 如何将memcached中item批量导入导出?
o 但是我确实需要把memcached中的item都dump出来,确实需要把数据load到memcached中,怎么办?
o memcached是如何做身份验证的?
o 如何使用memcached的多线程是什么?如何使用它们?
o memcached能接受的key的最大长度是多少?(250bytes)
o memcached对item的过期时间有什么限制?(为什么有30天的限制?)
o memcached最大能存储多大的单个item?(1M byte)
o 为什么单个item的大小被限制在1M byte之内?
o 为了让memcached更有效地使用服务器的内存,可以在各个服务器上配置大小不等的缓存空间吗?
o 什么是binary协议?它值得关注吗?
o memcached是如何分配内存的?为什么不用malloc/free!?究竟为什么使用slab呢?
o memcached能保证数据存储的原子性吗?

继续阅读

关于人面解锁功能的一些胡扯

刚看了一个视频,用照片欺骗android4.0的人面解锁功能,据我所说,很多电脑也带这个功能,但基本上都可以用照片的方式进行欺通过,毕竟照片和真实人面通过摄像头生成的都是相同的平形图形图像。

所以就想到一个方法

记录合法用户的几个不同的面部特征。比如 眨左眼 眨右眼 张大嘴 等不同的几个动作保存下来

在验证人面时,类似随机验证码的原理,随机通过动作的先后,例如:先眨右眼,再张嘴等来进行验证,这样一般来说,可以防止照片来欺骗

Redis 作者详谈 2.4 版本改进[转]

由于Redis集群可能在较长一段时间内还处理开发阶段,为了避免稳定版本由于这一原因被无限延后,于是从2.2版本fork出了一个2.4分支,这一分支目前进行了一些新的优化改进及bug修复,如果没有严重bug将会在近几个星期内发布稳定版本。

随后作者列出了2.4版本中的一大堆优化改进及Bug修复,主要有下面一些:

  • 对小数据量的sorted sets结构的内存使用做很大的优化
  • RDB文件的持久化速度也将会大大提高
  • 对目前的一些写操作命令进行了改进,支持批量写入功能
  • 启用新的内存分配模式 jemalloc.
  • 通过对copy on write机制使用的优化,数据持久化保存的子进程的内存占用将大大减少
  • INFO内容更加丰富
  • 新的OBJECT命令,提供对Redis存储value结构描述
  • 新的CLIENT命令,提供对Redis客户端连接的信息描述
  • 彻底将Slave对Master的连接改成非阻塞,之前connect(2)系统调用是会阻塞的
  • Redis-benchmark、Redis-cli 都进行了几个方面的改进
  • Make 改为彩色输出,更易读
  • VM机制彻底废弃
  • 总的来说2.4版本会在各方面有性能上的提升
  • Redis测试框架也有非常大的提升

继续阅读

首位国人PHP开发组成员以及他的Yaf

PHP开发组终于有了国人参与,  最近, Laruence(http://www.laruence.com),真名惠新宸,加入了PHP语言官方开发组.  做PHP的同学一定很熟悉他了, 他的博客风雪之隅发表了很多PHP源代码分析和扩展开发相关的文章.

 

他使用PHP扩展开发的PHP框架Yaf, 也进入了PHP官方扩展库(http://pecl.php.net/package/yaf),  这个框架借鉴目前最流行的PHP开发框架Zend Framework的设计, 迁移成本很低. 不过目前Yaf的英文文档还很不完善:http://www.php.net/manual/en/book.yaf.php, 中文文档稍微完善一些:http://yaf.laruence.com/manual/

Yaf的优点:
1. 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销.
2. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存.
3. 更短的内存周转周期, 提高内存利用率, 降低内存占用率.
4. 灵巧的自动加载. 支持全局和局部两种加载规则, 方便类库共享.
5. 高性能的视图引擎.
6. 高度灵活可扩展的框架, 支持自定义视图引擎, 支持插件, 支持自定义路由等等.
7. 内建多种路由, 可以兼容目前常见的各种路由协议.
8. 强大而又高度灵活的配置文件支持. 并支持缓存配置文件, 避免复杂的配置结构带来的性能损失.
9. 在框架本身,对危险的操作习惯做了禁止.
10.更快的执行速度, 更少的内存占用.

Yaf现在在国外已经被很多人关注, 包括Zend Framework的作者, 也在twitter上推荐了Yaf:
julienPauli:
pecl/yaf finally made it : A framework, inspired by ZendFramework, entirely writen in a C extension