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

屈伟

创业路上的程序猿

归档 - 11月, 2008

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 没有评论

gtalk群聊会开放?

google talk 群聊

google talk 群聊

今天无意中用了下Google Talk Gadget, Web版gtalk。发现里面有个群聊功能。

可以一次加多人聊天,跟msn的群聊差不多,能同时跟多个好友聊天。不知道什么时候加到gtalk客户端里。现在gtalk已经支持语音、文件传输,如果再支持群聊就爽了。期待ing

星期二, 11月 11th, 2008 未分类 3条评论

程序开发的效率:思路最重要

程序开发的效率,其实不是写代码的速度。经验相当的人,写代码的速度其实差不了多少。至少会是同一个数量级的。但思路和实现方法却不是差一点数量级的问题。

实现同样的功能和效果,按某些方法(虽然可能是常规方法),如果需要一周的工作量的话, 用变通的方法不仅能实现同样的功能(或许更好的),可能一天,甚至几个小时就搞定了。

最近深有体会。现在开始明白为什么微软这样的大公司在笔试的时候,程序要要做的智力类型的题目的比例会比实际考编程的还多。 明白为什么很多大公司招聘的笔试题里会有智力测试的部分。

举个例子。同事录里写日志有个功能,给所有好友发通知。接着问题来了,有些人觉得通知太多太烦了。现在要开发让用户屏蔽好友通知的功能。实现方法有很多,比如:

解决方案1、在我自己的用户表里,设置个字段,记录我屏蔽了哪些人。 下次遇到通知的时候,如果发送人是我记录的id的,就不显示。

程序需要处理:1)、屏蔽操作。将要屏蔽的人加到我的个人资料字段里。 2)、修改读通知的机制。每次读出以前判断。
存在的问题:读通知的地方太多了。需要修改的地方非常多。工作时间可能需要好几天,还可能出错。

解决方案2、当我屏蔽对方时,到对方记录里去记录。当对方写博客时,发现我屏蔽他了,就不发给我了。 不需要修改通知机制。几个小时就能完成。
问题又来了。我没办法知道我屏蔽了哪些人。总不能把我所有好友都读出来,判断一遍吧。 还可以在我的信息里也记录一下。

解决方案3、单独建一个数据表。用户需要屏蔽谁,直接在这个表里加一条记录,记录谁屏蔽了谁。我 和 被屏蔽的对方,都能很方便的从这个表知道, 我屏蔽了谁,谁屏蔽了我。 取消屏蔽很容易处理,直接删除一条记录就可以了。

发通知以前,查询下谁屏蔽我了,屏蔽了就不发。

最佳方案,几个小时就能完成编码工作。

(原文发布于同事录:http://tongshilu.com/2 )

星期日, 11月 9th, 2008 技术 1条评论

TechWeb博客终于切换成功了。

经过2周的努力,终于将oblog系统切换成wordpress mu了。尽情体验强大的wordpress吧。

oblog功能不错,也非常符合国人习惯,但存在很多问题:

  • 安全性。这是最致命的。oblog继承了asp程序的本性,安全性非常差。经常出现漏洞,博客三天两头的被挂马。
  • 搜索引擎体验不好。页面很多东西都是js的。oblog是静态页面+js结合的方式。都什么年代了,还这么老土。除了性能我们也要友好的搜索引擎体验。

当然优点也有很多。比如符合国人习惯,内置相册、内置聚合首页等等适合做成一个博客门户的东西。

但是没办法,我们不能接受一个经常被挂马的博客程序。源代码还是封装的,改都改不了。

当然wordpress也存在很多问题,比如wordpress mu版给每个用户建了上十个数据表,不符合国人习惯,没有聚合首页等等。下一篇文章我具体说说wordpress mu的技术解决方案。

星期日, 11月 9th, 2008 瞎扯 5条评论

大家好

我新测试的博客

星期四, 11月 6th, 2008 未分类 2条评论