博客首页|TW首页| 同事录|业界社区

屈伟

创业路上的程序猿

PHP

PHP对Berkeley DB游标遍历的方法

PHP操作Berkeley DB有两种方法,一是通过DBA系列函数来实现,具体看php手册dba_open,二是直接通过使用Berkeley DB自带的PHP API。 安装Berkeley DB的PHP扩展的方法可以看这篇博客

我现在遇到了一个问题,需要对bdb的数据list出来。如果用dba_open里面提供了list方法。用DB4只能用游标。Berkeley DB官方提供的PHP API里,游标的函数:

class Db4Txn {
    function abort() {}
    function commit() {}
    function discard() {
    function id() {}
    function set_timeout($timeout, $flags = 0) {}
}

直接调用get方法报错,跟C的api对比了下,发现php的手册提供的函数少了一个参数。

设置游标起始位置,$key 是bdb key-value中的key, $val 可以为空
$cursor->get($key, $val, DB_SET); //设置游标的起始位置
遍历数据库:
while( 0 === $cursor->get($key, $val, DB_NEXT) ) { echo $key, " => ", $val, " \r\n";}
完整的php操作bdb和游标使用实例如下:

$dbenv = new Db4Env();
$dbenv->set_data_dir(”/data/www/cp/tmpdb4/”);
$dbenv->open(”/data/www/cp/tmpdb4/”);

$db = new Db4($dbenv);
$db->open(null, ‘fileName2′, ‘ddb_name2′);
$counter = $db->get(”counter”);
print “Current value of counter is $counter\n”;
$db->put(”counter”, $counter+1);

for($i=0; $i<1000; $i++ ) {
$db->put(md5($i), “i: $i date:”.date(”Y-m-d H:i:s”).” - md5:”.md5($i) );
}

$i = 300;
$key = md5($i);

$cursor = $db->cursor(); //游标

$cursor->get($key, $val, DB_SET); //设置游标的起始位置

$k = 0;
while( 0 === $cursor->get($key, $val, DB_NEXT) ) { //遍历
echo $k, “, “, $key, ” => “, $val, ” \r\n”;
$k ++;
}

星期三, 02月 4th, 2009 PHP, 未分类 没有评论

CURL处理返回page not found页面问题

用curl抓取页面时,一般根据curl_exec的返回内容判断是否抓取成功了。但我发现,访问有些站点本来是返回404错误,但页面有内容时,curl把page not found的内容也抓回来了。如果以curl_exec的结果判断是否正确抓取就被误导了。如下面的代码:$url = 'http://www.cq.xinhuanet.com/house/2008-11/24/content_14996426.htm-';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_ENCODING, “gzip, deflate”);
curl_setopt($ch, CURLOPT_USERAGENT, “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; CIBA; InfoPath.1; .NET CLR 2.0.50727)”);
curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //自动跟踪location
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //Timeout
curl_setopt($ch, CURLOPT_HEADER, 1);
//curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$contents = curl_exec($ch);
curl_close($ch);

if (false == $contents || empty($contents)) {
echo $contents;
} else {
echo “抓取页面失败!”;
}

查了下手册,发现curl里还有个curl_getinfo函数。应该判断http状态:
$contents = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code >= 400) { //400 - 600都是服务器错误
echo “访问失败!”;
exit;
} else {
echo $contents;
}
curl_close($ch);

星期二, 11月 25th, 2008 PHP 2条评论

CodeIgniter数据库缓存自动过期的处理

CodeIgniter框架是一个非常小巧的PHP框架,最近几个项目中一直用。CI自带数据库文件缓存,但按官方的说法,缓存设置后永不过期,出发你调用方法主动删除。

Cache files DO NOT expire. Any queries that have been cached will remain cached until you delete them.

感觉太弱智了,非常不方便。 我修改了一下db类,在开启缓存时设置一个过期时间,到期自动缓存自动失效。

1:CI database/DB_dirver.php 中 1021行 cache_on 函数替换为
function cache_on($expire_time=0) //add parm expire time - 缓存过期时间
{
$this->cache_expire_time = $expire_time; //add by kenvin
$this->cache_on = TRUE;
return TRUE;
}

2:CI database/DB_cache.php 中 90行 read 函数 if (FALSE === ($cachedata = read_file($filepath))) 一行前面加上
//判断是否过期 // cache_expire_time
if ( !file_exists($filepath) ) {
return false;
}
if ( $this->db->cache_expire_time > 0 && filemtime($filepath) db->cache_expire_time) {
return false;
}

这样,在需要开启缓存的地方,由以前的 $this→db→cache_on(); 改为
$this→db→cache_on($SEC);
$SEC 为缓存过期时间,以秒为单位。 如 $this→db→cache_on(60);表示缓存60秒后过期

星期三, 11月 19th, 2008 PHP 没有评论