linux上持久性存储服务dbcached的安装

3条评论

2011 年 11 月 24 日 at 上午 9:47分类:Cache | Linux | PHP

dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。dbcached = Memcached + 持久化存储管理器 + NMDB 客户端接口以此来实现的,这个和之前说的memcachedb在功能上面都是一样的,都是实现持久性的数据存储功能,但是他们肯定有不同点,其中dbcachedb是基于Memcached 内存缓存性能优势方面来设计的,而memcachedb是使用 Berkeley DB 数据库自身的缓存来实现,是围绕 Berkeley DB 进行开发的,更多的不同点去找谷歌大神吧!
dbcached安装需要以下三个包:
1、http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
2、http://fallabs.com/qdbm/qdbm-1.8.78.tar.gz
3、http://auriga.wearlab.de/~alb/nmdb/files/0.21/nmdb-0.21.tar.gz
我们先来安装第二个和第三个包,第二个包是一个管理数据库的例程库,QDBM 读写速度比 Berkeley DB 要快,相当于是一个DB,
然后再来安装第三个包,它是一款多协议网络数据库(dbm类)管理器,它由内存缓存和磁盘存储两部分构成,使用 QDBM 或 Berkeley DB 作为后端数据库。
最后再来安装dbcahed,为什么要按照这个顺序来安装,原因是在安装完dbcached的时候需要启动这个服务,但是启动这个需要qdbm这个服务,除非你只是把它当作一个简单memcahed服务来跑。
安装QDBN:

# wget http://fallabs.com/qdbm/qdbm-1.8.78.tar.gz
# tar zxvf qdbm-1.8.78.tar.gz
# cd qdbm-1.8.78
# ./configure --prefix=/usr
# make && make install
# cd ..

安装NMDB管理器:

# wget http://auriga.wearlab.de/~alb/nmdb/files/0.21/nmdb-0.21.tar.gz
# tar zxvf nmdb-0.21.tar.gz
# cd nmdb-0.21
# make BACKEND=qdbm ENABLE_TIPC=0 ENABLE_SCTP=0 install
# cd ..

启动NMDB这个管理器

 # /usr/local/bin/nmdb -d /data/nmdb/dbcached.db -t 26010 -T 192.168.214.138 -u 26010 -U 192.168.214.138 -c 1024
/**
-d 数据库路径(这里使用比 Berkeley DB 更快的 QDBM 数据库),例如我把数据库文件放在/data/nmdb/dbcached.db
-t TCP 监听端口 (默认:26010)
-T TCP 监听地址 (默认:任何地址)
-u UDP 监听端口 (默认:26010)
-U UDP 监听地址 (默认:任何地址)
-c 最大的缓存对象数目,单位为千 (默认:128) 
*/

这些参数在等会的dbcachedb的启动过程中是会用到的,如果在启动的过程中报一个erring的错误说一个lib***.so的什么文件找不到,那么就需要把/usr/lib/目录下面的相应文件CP到/usr/lib64/目录下,然后再执行上面的启动命令就不会有问题了。
安装dbcached:

# wget http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
# tar zxvf dbcached-1.0.beta2.tar.gz
# cd dbcached-1.0.beta2
# ./configure --prefix=/usr/local/dbcached
# make && make install

安装完毕,启动它:

/usr/local/dbcached/bin/memcached -d -m 256 -p 11213 -c 1024 -u root -x 192.168.214.138 -y 26010 -z 26010
/**
-x nmdb 服务器的域名或者IP地址,推荐使用IP地址
-y <端口号> nmdb 服务器的TCP端口号 (默认: 26010) 支持 set/delete/... 等写命令 和 get 等读命令
-z <端口号> nmdb 服务器的UDP端口号 (默认: 26010) 只支持 get 等都命令, 当使用 -z 参数时,将使用 UDP 协议代替 TCP 协议执行 set 操作,执行 get 操作时仍然使用 TCP 协议。强烈推荐加上 -z 参数。
*/

安装完毕,看下测试文件:

$m = new Memcache;
if( $_GET['db'] )
{
if($_GET['db'] == '1')
   $m->connect('192.168.214.138','11211') or die('can not connect memcache server!'); //memcache
elseif($_GET['db'] == '2')
   $m->connect('192.168.214.138','11212') or die('can not connect memcachedb server!'); //memcachedb
elseif($_GET['db'] == '3')
   $m->connect('192.168.214.138','11213') or die('can not connect dbcached server!'); //dbcached	
}
else
{
	die("请选择缓存的类型(设置DB变量)");
}
$m->set('test_key','test_value');
echo $m->get('test_key');

数据输出正常,然后重新启动服务器,数据照样存在,此外在你的/data/nmdb/dbcached.db文件中已经有数据了,你重新set一次值,那么这个文件的size就会增加写入内容的byte数。

OK !!

参考资料:
1、http://blog.s135.com/post/329/
2、http://www.4ucode.com/Study/Topic/1007644

php安装dba拓展

没有评论

2011 年 11 月 23 日 at 上午 9:26分类:Linux | PHP

这几天在项目中要用BerkeleyDb来处理数据,还好php有这方面的API,就是需要安装dba这个拓展,安装方法如下:
安装过程跟普通php的扩展安装没区别

 cd php_src_xxx/ext/dba

 phpize

./configure –enable-dba=shared -with-db4  –with-php-config=/usr/local/php/bin/php-config

这里的-with-db4的db4是dba系列函数的那个string参数handler, 即dba_open(“dbfile”,”n”,”db4″)第三个参数

cp dba.so 到 extension_dir目录中

echo ‘extension=dba.so’ >> php.ini//添加到php的配置文件中。

OK!!!

PHP团队协作开发,统一使用linux服务器环境

没有评论

2011 年 11 月 22 日 at 下午 8:26分类:Linux | PHP

相信大部分的程序员都是在windows环境下面开发的,除非是那些老鸟。随之问题而来,我们在windows下面开发,但是项目是要放到Linux上面去跑的,因此我们的开发环境尽量也要采用Linux,但是这样子的话,修改代码便成了个麻烦的事情,文件量少的的时候感觉不出来,但是一旦文件量很多那么就很头疼了。
之前总是用ftp或者SSH传过去,但是修改频繁了用起来还是很麻烦的。后来突然从网上找到了一个非常好的方法,就是在linux下把windows的硬盘mount过来,这样在linux上就想使用本地硬盘一样可以直接编译,修改都可以了。
操作如下:
1:在windows下共享需要允许访问的文件夹
2:然后在linux下:使用cifs类型mount

    mount -o sync -t cifs //192.168.214.138/test /home/wwwroot -o username=fbbin,password=binbin,rw 

用户名和密码是共享这台PC机的,如果不对的话,那么会禁止访问的,因此这个不能出错。

这样子我们只要在test目录下面修改文件,然后保存,这个时候数据就会自动同步到Linux上面的的指定目录中,那么我们在linux上面就可以直接访问了,就跟在windows上面是一样的。

使用fastcgi_cache加速你的Nginx网站

没有评论

2011 年 11 月 20 日 at 下午 9:36分类:Cache | Nginx | PHP

  对于变化不太频繁的数据,大家都比较喜欢存Memcached以减少数据库的读取,但还是会有语言解析运行上的消耗(比如运行PHP,Python等),当然这个时间很短,记得OP上有个同学说P字头的语言,效率都不高,如果能省去,当然最好。(已经用上Squid等的可以忽略本文)。还有一个问题就是很多时候一个页面由多个数据片断组成,为了提高页面速度,要么分别缓存,要么整体缓存(所谓的Page Cache),其实都比较麻烦,增加和减少数据片断的时,大多需要调整。最后一个问题,所有的数据都存Memcached是否经济?服务器资源足够多的无所谓,捉襟见肘的就要考虑了,当然,生成静态页面是一种方法,需要维护,还是比较累。好吧,nginx的fastcgi_cache可以解决上面的那些问题,比较squid等的好处是简单,不需再要去维护另外一个系统,适合不那么大的网站。
关于Nginx fastcgi_cache,基础的可以参看Nginx官方文档http://wiki.nginx.org/HttpFcgiModule,下面是一个典型的做法是:

fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key $request_method://$host$request_uri;
 

  注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空,全局定义一个缓存空间,配置文件名为,fastcgi_cache.conf,然后在vhost配置里面加上:

fastcgi_cache ngx_fcgi_cache;
include fastcgi.conf;
 

  大概解释下各个参数的含义:
  fastcgi_temp_path:生成fastcgi_cache临时文件目录
  fastcgi_cache_path:fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区。
  fastcgi_cache_valid:定义哪些http头要缓存
  fastcgi_cache_use_stale:定义哪些情况下用过期缓存
  fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。
  fastcgi_cache:用哪个缓存空间
  这样就可以了,基本上可以work,但还没完,如何手动清除缓存?有个Nginx的第三方扩展可帮你做到:https://github.com/FRiCKLE/ngx_cache_purge/,如果对大多数第三方扩展无爱,写个清除的脚本也非常简单,以PHP为例:

<?php
function purgeCache()
{
    $url = $this->post('url');
 
    if (empty($url) || !Cola_Com_Validate::url($url)) {
        exit('请输入正确的URL。');
    }
 
    $md5 = md5($url);
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
 
    if (!file_exists($cacheFile)) {
        exit('缓存不存在。');
    }
 
    if (@unlink($cacheFile)) {
        echo '清除缓存成功。';
    } else {
        echo '清除缓存失败。';
    }
}
 

  核心是第11行,直接找到缓存文件,然后删掉就可以,这个脚本有个副作用,手动清除之后,缓存失效,但Nginx后面还会自己清除一遍,然后报个unlink失败的日志,不过无关紧要了。
  淡定,文章还没完,要不就成标题党了,Nginx fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
 

如果用CI的话,那么就是:

$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT');
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

  这样就告诉Nginx,这个页面不需要缓存。
  好吧,要淡定不要D疼,还有最后一个问题,如果页面中只有一小部分内容不可以缓存,可以用Nginx fastcgi_cache吗?比如某个内容页,大部分内容可以缓存,但希望把用户的登录信息更新上去。答案是肯定的,可以直接输出用户未登录的页面样式,等页面加载完毕之后,通过ajax异步更新用户信息

原文来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/1118/9312.html

linux上memcachedb存储引擎的安装

没有评论

2011 年 11 月 16 日 at 下午 2:41分类:Cache | Linux | PHP

在安装memcachedb服务之前如果要调试的话,还需要安装上memcache和memcached这两个东西,当然我这边是基于PHP环境来操作的!
在PHP中安装memcache过程命令如下:

#yum install libevent libevent-devel   #安装依赖包
#cd /usr/local/src
#ll
#wget http://pecl.php.net/get/memcache-2.2.6.tgz
#tar vxzf memcache-2.2.6.tgz
#cd memcache-2.2.6
#/usr/local/php/bin/phpize
#./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config --with-zlib-dir
#make
#make install

再来安装memcached服务

cd /usr/local/src/
wget http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz
ll
tar zxvf memcached-1.4.10.tar.gz
cd memcached-1.4.10
./configure
make
make install

启动memcached服务

 memcached -d -m 10 -u root -l 122.225.117.253 -p 11211 -c 256 -P /tmp/memcached.pid

要想在php中能用memcache那么酒吧memcache.so文件添加到php.ini文件中!
===================================================================================
安装memcachedb服务需要以下包:
berkeleydb : http://download.oracle.com/otn/berkeley-db/db-4.7.25.tar.gz
memcachedb : http://memcachedb.googlecode.com/files/memcachedb-1.2.0.tar.gz

安装berkeleydb

# tar zxvf db-4.7.25.tar.gz
# cd db-4.7.25/build_unix/
# ../dist/configure
# make
# make install

安装memcachedb

# tar zxvf memcachedb-1.2.0.tar.gz
# cd memcachedb-1.2.0
# ./configure
# make
# make install

这上面的安装可能需要版本的匹配的问题,我之前安装的berkeleydb是最新版的5.2的,但是我在安装memcachedb1.2时,发现这个1.2版本的需要的berkeleydb版本是4.7的,因此我这边安装的berkeley版本是4.7的。
以上为止,memcachedb存储引擎安装完毕了。
启动memcachedb服务:

//端口是11212
memcachedb -p 11212 -d -r -u root -l 192.168.50.117 -H /data/mdb_11212 -N -P /tmp/memcachedb.pid

如启动报Berkeley Db的文件找不到那么执行以下这句话:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/BerkeleyDB.4.7/lib

以下是关于memcache和memcachedb的测试代码

$m = new Memcache;
if( $_GET['db'] )
   $m->connect('192.168.214.138','11211') or die('can not connect memcache server!'); //memcache
else
   $m->connect('192.168.214.138','11212') or die('can not connect memcachedb server!'); //memcachedb

memcache和memcachedb两者主要是存储方式不一样,一个是存储在内存中,一个用的是Berkeley的文件数据库和memcachedb的网络性能,实际上是支持memcache的很多方法,然后解除了丢失数据的风险,当然,会带来性能上的小损失。
两者的使用方法是完全一样的。

参考:

http://www.cnblogs.com/eoiioe/archive/2008/11/11/1331238.html

http://hi.baidu.com/hqlulu/blog/item/530df6fe7c0396365d600842.html

Nginx(PHP/fastcgi)的PATH_INFO问题

没有评论

2011 年 11 月 12 日 at 下午 7:13分类:Nginx | PHP

PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体.
比如, 我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 另外不少PHP框架也使用PATH_INFO来作为路由载体.
在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:
如果在服务器在存在一个/laruence/index.php
那么, 对于如下请求,
/laruence/index.php/dummy
/laruence/dummy
Apache都接受, 都会认为是对info.php的访问, 并会设置PATH_INFO为dummy
而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.
而因为默认的配置文件对PHP的支持只是很基础的, 所以对于默认配置来说对于上面的访问也会是404, 提示找不到文件出错.
这对于一些使用PATH_INFO来传递关键信息的PHP框架来说(比如Kohana, Thinkphp), 简直是致命的.
对于这个问题, 一般来说有俩种解决方法, 第一种就是使用rewrite, 但是这个方法的缺点也是很明显的, 需要把PATH_INFO转换成Query String. 此处就不说明这种方法了~
而, 第二种方法就是我今天要提的, 模拟PATH_INFO:
首先 , 我们知道在Nginx中, 是通过对文件名的扩展名匹配, 来决定是否要交给php cgi服务器去解释的. 在nginx.conf中一般都有如下的默认配置段:

location ~ .php$ {
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
}

所以,对于形如/laruence/info.php/pathinfo这样的文件路径, Nginx是不会正确的交给php cgi服务器的. 所以我们需要改写这段配置为:

     location ~ .php {//片段匹配
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
}

现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?
首先, 我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(ini配置解释), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值(其实也就是说明, PHP最初对CGI 1.1的支持并不到位)
然后, 就只要添加一个FASTCGI_PARAM项就好了:

location ~ .php {
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
     fastcgi_param PATH_INFO $fastcgi_script_name;
}

现在试试吧…

btw: 当然, 上面的解决方法, 把对路径的分析交给了PHP去处理, 网上也有朋友给出了另外一种配置方法, 这个方法是由Nginx来分析路径(也就不需要fix_pathinfo):

location ~ \.php
{
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
     set $path_info “”;
     set $real_script_name $fastcgi_script_name;
     if ($fastcgi_script_name ~ “^(.+?\.php)(/.+)$”) {
     set $real_script_name $1;
     set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

后记, 最近发现的一个安全漏洞(Nginx + PHP CGI的一个可能的安全漏洞)和这个配置有关系, 请大家务必在使用第二种配置的时候,关闭cgi.fix_pathinfo. 另外关于这个漏洞我个人认为这个和Nginx没啥关系, 不属于Nginx的漏洞. 是配置的问题, 现在到处都在说是Nginx的Bug, 不妥不妥

mysql的事务

没有评论

2011 年 11 月 08 日 at 下午 2:14分类:MySQL

先来明确一下事务涉及的相关知识:
事务都应该具备ACID特征。所谓ACID是Atomic(原子性),Consistent(一致性),Isolated(隔离性),Durable(持续性)四个词的首字母所写,下面以“银行转帐”为例来分别说明一下它们的含义:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。换句话说,事务是不可分割的最小单元。比如:银行转帐过程中,必须同时从一个帐户减去转帐金额,并加到另一个帐户中,只改变一个帐户是不合理的。
一致性:在事务处理执行前后,数据库是一致的。也就是说,事务应该正确的转换系统状态。比如:银行转帐过程中,要么转帐金额从一个帐户转入另一个帐户,要么两个帐户都不变,没有其他的情况。
隔离性:一个事务处理对另一个事务处理没有影响。就是说任何事务都不可能看到一个处在不完整状态下的事务。比如说,银行转帐过程中,在转帐事务没有提交之前,另一个转帐事务只能处于等待状态。
持续性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。比如:银行转帐过程中,转帐后帐户的状态要能被保存下来。
再来看看哪些问题会用到事务处理:

这里不说“银行转帐”的例子了,说一个大家实际更容易遇到的“网上购书”的例子。先假设一下问题的背景:网上购书,某书(数据库编号为123)只剩最后一本,而这个时候,两个用户对这本书几乎同时发出了购买请求,让我们看看整个过程:
在具体分析之前,先来看看数据表的定义:

create table book
(
    book_id unsigned int(10) not null auto_increment,
    book_name varchar(100) not null,
    book_price float(5, 2) not null, #我假设每本书的价格不会超过999.99元
    book_number int(10) not null,
    primary key (book_id)
)
type = innodb; #engine = innodb也行

对于用户甲来说,他的动作稍微比乙快一点点,其购买过程所触发的动作大致是这样的:

1. SELECT book_number FROM book WHERE  book_id = 123;
book_number大于零,确认购买行为并更新book_number
2. UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123;
购书成功

而对于用户乙来说,他的动作稍微比甲慢一点点,其购买过程所触发的动作和甲相同:

1. SELECT book_number FROM book WHERE  book_id = 123;
这个时候,甲刚刚进行完第一步的操作,还没来得及做第二步操作,所以book_number一定大于零
2. UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123;
购书成功

表面上看甲乙的操作都成功了,他们都买到了书,但是库存只有一本,他们怎么可能都成功呢?再看看数据表里book_number的内容,已经变成“-1”了,这当然是不能允许的(实际上,声明这样的列类型应该加上unsigned的属性,以保证其不能为负,这里是为了说明问题所以没有这样设置)
好了,问题陈述清楚了,再来看看怎么利用事务来解决这个问题,打开MySQL手册,可以看到想用事务来保护你的SQL正确执行其实很简单,基本就是三个语句:开始,提交,回滚。
——————————————————————————-
开始:START TRANSACTION或BEGIN语句可以开始一项新的事务
提交:COMMIT可以提交当前事务,是变更成为永久变更
回滚:ROLLBACK可以回滚当前事务,取消其变更
此外,SET AUTOCOMMIT = {0 | 1}可以禁用或启用默认的autocommit模式,用于当前连接。
——————————————————————————-
那是不是只要用事务语句包一下我们的SQL语句就能保证正确了呢?比如下面代码:

BEGIN;
SELECT book_number FROM book WHERE  book_id = 123;
// ...
UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123;
COMMIT;

答案是否定了,这样依然不能避免问题的发生,如果想避免这样的情况,实际应该如下:

BEGIN;
SELECT book_number FROM book WHERE  book_id = 123 FOR UPDATE;
// ...
UPDATE book SET book_number = book_number - 1 WHERE  book_id = 123;
COMMIT;

由于加入了FOR UPDATE,所以会在此条记录上加上一个行锁,如果此事务没有完全结束,那么其他的事务在使用SELECT … FOR UPDATE请求的时候就会处于等待状态,直到上一个事务结束,它才能继续,从而避免了问题的发生,需要注意的是,如果你其他的事务使用的是不带FOR UPDATE的SELECT语句,将得不到这种保护。
实际在开发过程中,我们基本上不会自己去写一些事务的sql语句,比如我们在用CI框架时,里面有自带的事务处理机制:

$this->db->trans_start();
$this->db->query('a sql');
$this->db->query('anthor sql');
$this->db->query('.....');
$this->db->trans_complete();
if($this->db->trans_status === false){
    $this->db->trans_rollback();//执行失败,回滚(返回到操作之前的数据)
}

搭建图像人脸定位服务OpenCV和php-facedetect拓展

没有评论

2011 年 11 月 07 日 at 下午 1:41分类:Linux | PHP

在安装OpenCV之前,需要安装OpenCV依赖包:如下:OpenCV安装之前必须依赖的包:pkgconfig、libpng、zlib、libjpeg、libtiff、python,这些包有些事Linux默认已经装好,有些是需要自己安装的。
然后我们从网上下载OpenCV的源码吧进行编译安装,下载地址:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.0/;
一下安装命令代码:

# cd /usr/local/src
# wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.0/OpenCV-2.0.0.tar.bz2/download  #下载文件
# wget http://www.cmake.org/files/v2.8/cmake-2.8.6.tar.gz   #需要安装cmake
# tar -zxvf cmake-2.8.6.tar.gz
#  cd cmake-2.8.6
#  ./bootstrap
#  make
#  make install
#  cmake # 这样子cmake就安装好了
# tar -xjf OpenCV-2.0.0.tar.bz2
# mkdir opencv.build 
# cd opencv.build 
# cmake
# ../OpenCV-2.0.0/configure 
# make -j 2 
# make install 
# ldconfig # linux only
# make check # 检测

至此,OpenCV服务就已经安装好了,接下来安装php的拓展:php-facedetect

# cd /usr/local/src
# wget http://www.xarg.org/download/facedetect-1.0.0.tar.gz    #下载拓展包
# tar zxvf facedetect-1.0.0.tar.gz
# cd facedetect-1.0.0
# /usr/bin/phpize
# ./configure
# make #这里如果有报错信息,那么就执行如下命令
# cp facedetect.loT facedetect.lo  # 然后再重新编译安装
# /usr/bin/phpize clear
# /usr/bin/phpize
# ./configure
# make
# make install

此时编译完之后会提示facedetect.so 文件所在的位置。最后确认在php.ini加入extension=facedetect.so,重启nginx
如果一些正常的话,那么就说明已经安装成功了!
从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下
测试例子:

<?php

var_dump(face_count('party.jpeg', 'cascade.xml'));
var_dump(face_detect('party.jpeg', 'cascade.xml'));

?>

参考资料:
1:http://www.u85.us/viewnews-929.html
2:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.0/
3:http://www.xarg.org/project/php-facedetect/
4:https://github.com/infusion/PHP-Facedetect

反新浪的生成短网址

没有评论

2011 年 11 月 05 日 at 下午 2:02分类:PHP

<?php
function base62($x) 
{ 
    $show = ''; 
    while($x > 0) { 
        $s = $x % 62; 
        if ($s > 35) { 
            $s = chr($s+61);             
        } elseif ($s > 9 && $s <=35) { 
            $s = chr($s + 55); 
        } 
        $show .= $s; 
        $x = floor($x/62); 
    } 
    return $show;     
} 
 
function urlShort($url) 
{ 
    $url = crc32($url); 
    $result = sprintf("%u", $url); 
    return base62($result); 
} 
 
echo urlShort("http://blog.fbbin.com"); 

服务器启动sshd失败的解决方法

没有评论

2011 年 11 月 04 日 at 上午 9:15分类:Linux

服务器SSH不可以登陆。
在服务器直接登陆。启动SSH
#service sshd start
不可以启动。提示如下信息:
/var/empty/sshd must be owned by root and not group or world-writable.
到/var/empty/目录下,查看文件属性。
#cd /var/empty
#ll
显示sshd目录的文件权限是777.用户及组 是root。修改sshd文件权限为755
#chmod -R 755 sshd/
重新启动sshd服务。
#service sshd start
sshd启动成功。