十一/111
用Drupal快速实现mobile平台服务端
用Drupal很容易实现一个API,让手机平台或者其他系统使用json的格式进行通信。
<?php
define('API_ERRORNO_INVALID_ACTION', 1);
define('API_ERRORNO_INVALID_PARAM', 2);
define('API_ERRORNO_NO_RECORD', 3);
define('API_ERRORNO_INVALID_NAME', 4);
define('API_ERRORNO_USER_BLOCKED', 5);
define('API_ERRORNO_LOGIN_FAILED', 6);
// 根据错误代码返回错误信息
function api_message_wrapper($errno) {
$message = array(
API_ERRORNO_INVALID_ACTION => '非法的请求动作',
API_ERRORNO_INVALID_PARAM => '非法的请求参数',
API_ERRORNO_NO_RECORD => '查找不到数据',
API_ERRORNO_INVALID_NAME => '非法的手机号码',
API_ERRORNO_USER_BLOCKED => '当前用户已经被禁用',
API_ERRORNO_LOGIN_FAILED => '登陆失败',
);
return isset($message[$errno]) ? $message[$errno] : '未知的错误';
}
// 验证合法的action
function api_action_route($action) {
$valid_actions = array(
'login' => 'login',
'register' => 'register',
'getCardInfos' => 'get_card_info',
);
return isset($valid_actions[$action]) ? $valid_actions[$action] : false;
}
function api_menu() {
$items['api'] = array(
'page callback' => 'api_dispatch',
'access callback' => TRUE,
//'access arguments' => array('使用API'),
'type' => MENU_CALLBACK,
'file' => 'api.functions.inc',
);
return $items;
}
// 成功返回
function api_response_sucess($data) {
drupal_json(array('ERRNO' => 0, 'DATA' => $data));
}
// 失败返回
function api_response_error($errno) {
if ($errno && is_numeric($errno)) {
drupal_json(array(
'ERRNO' => $errno,
'MSG' => api_message_wrapper($errno),
));
}
}
// API调度入口
function api_dispatch() {
if (!isset($_POST['ACTION']) || !api_action_route($_POST['ACTION'])) {
api_response_error(API_ERRORNO_INVALID_ACTION);
}
elseif (!isset($_POST['PARAM'])) {
api_response_error(API_ERRORNO_INVALID_PARAM);
}
else {
$param = json_decode($_POST['PARAM']);
call_user_func('api_call_'. api_action_route($_POST['ACTION']), $param);
}
}
七/110
用yii框架开发web应用
好久没写博客了,都是在微博中堕落了,加上最近特别忙,入手了一台MBP。更换了工作平台,准备看些新的适合web2.0的高性能纯面向对象框架,yii就是我想要的了。
官方文档比较齐全,有多语言在线文档和两本pdf书籍以及一个用yii搭建blog程序的向导。学习曲线不算曲折,很快就上手用它来写东西。特性一大堆,刚开始不可能熟悉所有的,只是看了数据库和用户验证以及表单部分,一般的web应用就能应付了。至于怎么让yii更好的为你工作,完全深入它的很多机制只能在接下来的时间中慢慢熟悉。对于从别的mvc模式的框架转移到yii,几乎不用花费太多时间。有两个图看明白了概念也就清晰了,一个是路由处理的流程图,一个是mvc加上组件以及其他附属品的结构图。
繁忙的生活让我最近颓废了好多,以前2个星期一本书的习惯已经荒废了半年了,打算10-1后振作下,坚持下去这个习惯。近期打算翻译一些网络安全书籍,给drupal社区提交一些开源模块,尝试一些新鲜的东西。
十二/100
Drupal编程总结
从2007年末接触Drupal开始,已经3年时间了。Drupal已经从5.x版本升级到了7.x,模块开发也发生了很多变化。
1. 在查询数据库的时候,考虑到一些特殊情况尽量使用静态变量,这相当于drupal的第一层缓存,在drupal的很多load相关函数中到处可见。比如:
function terrysco_get_group($lgid, $reset = false) {
// 使用静态变量做缓存
static $linkedin = array();
if ($reset) {
$terrysco = array();
}
if (!isset($terrysco[$lgid]) && is_numeric($lgid)) {
$terrysco[$lgid] = db_fetch_array(db_query(‘SELECT * FROM {linkedin_groups} WHERE lgid = %d’, $lgid));
}
return isset($terrysco[$lgid]) ? $terrysco[$lgid] : false;
}
这样,在要处理一个大的结果集的时候,在循环中调用该函数,就不会每次循环都查询数据库了。
2. 深入理解drupal的hook机制,用好module_invoke_all来设计你的模块机制,大大增强扩展性。其他方面,多想想怎么和别的模块工作的更好,不要进行hack的工作,要给别的模块留下更改你输出主题,更改你返回数据的机会。
3. 多使用表单给用户进行参数配置,将这些配置用variable_set存起来随时使用,生成配置表单的时候可以使用system_settings_form()将表单数组包装起来,省去了写提交函数的部分。另外,将一些数据分析后可以适当存储在session或者cookie中,不一定非要写数据库。
4. 不要过于依赖node机制。node给我们提供了很多方便,很多第三方模块装上后就能很好的工作,比如fivestar,views之类的东西,但也要考虑实际项目需要。很多小的数据如果量很大,不建议放在node表中。而且node表以nid作为auto_increment的primary key,给我们日后做扩展留下了很多麻烦。
5. 不要过于依赖第三方模块。第三方模块的一个共同点就是功能强大,代码质量还算不错,但是正因为如此,模块开发者考虑到的是通用性,一个大的模块可能很多功能我们使用不了,这时候就不要偷懒了,自己动手吧。而且很多第三方模块是有问题的,自己细心研究下就能发现很多。
6. Drupal本身支持快速切换数据库,这就使得我们可以在开始的时候就做好设计,看看是否将某些业务分离。当然,如果是中小型的项目就不用了。
未完待续。。。
十/102
CakePHP Application Development
花了三天时间看完了《CakePHP Application Development》这本PDF文档,感叹作者的耐心,何奇的淡定。且不说我这个用了PHP做应用5年的人,就算是一个PHP不怎么了解的人估计都能看懂。这本书从头到尾都在案例之后进行分析,我觉得好处在于对初学者来说在cakephp这个框架能打好基础,对cakephp的个方面了解比较透彻。虽然从头到尾300多页感觉如果精简的话可能只有100多页,但是我不认为多余的是废话。只有对技术比较刨根问底的人才能把一门技术写的请清楚楚,让看客们也请清楚楚,明明白白。比起其他一些作者,写出来的东西都是一律而过来得更为实在。
cakephp是基于MVC这个模式来组织代码的,所以此书最重要的三章应该就是分别介绍controller,model和view的三章。早就听说cakephp是ror的php版本,虽然说法有些夸张,但是在cake里面还是能看到很多ror的思想和影子。很多人也说cake的Model实现方式过为复杂,我想只是使用群体不一样,具体的项目具体对待。
这次是因为一个中型项目而让我对cakephp产生要了解的想法。因为虽然php的framework很多,但是不像java阵营那样,php相关的框架大都是毁誉参半的,而且个别流行的框架也没有强大的社区支持。从众多的php框架中我选择了国产的thinkphp,相当于官方的zend framework以及轻量级的codeigiter,最后就是本文主要介绍的cakephp。选择的过程是个纠结的过程,因为框架的选择角度太多了,但从代码风格上来说,我更趋向于cake的代码。仔细研究了下,发现cake做的很人性化,这里人性化的意思是作者很像是个做产品的人,因为从很多地方都体现出了cake的方便和人性化。比如scaffold这个基本功能,在codeigiter里面也有,cake里面只需要在controller里面声明一个scaffold属性就行了,相当简单。
大家都知道,较高的便利性下面都隐藏着大量的命名约定。因为你只有遵守了框架作者的约定和设计思想,你才会得到很大的便利。因为作者在设计的时候,如果考虑使用者各种各样的习惯,设计出来的东西谁都用着不舒服了,只有使用者遵循一定的规则,框架就能带来强大的生产力,这也就是cake的脚本可以跑起来的前提条件。cake拥有一个小型的“shell”,叫做bake,ROR和Djangle都有类似的支持。只要我们在controller,model和views以及数据库设计的时候遵循了cake的命名约定,那么这一些都可以用bake来帮你处理。
我用cakephp建立了一个简单的定餐应用,发现确实像口号中所说那样:rapid development。大概一个下午,就做出了一个成熟的定餐系统应该有的所有功能。这样我就不用羡慕很多java开发者可以使用成熟的框架了,没办法自己对java也挺了解的,为什么就没法在实际应用中应用呢?总觉得太重。
搜索cakephp的时候,在网上看到一些中文资料,但质量都不是很好,强烈建议对cakephp有兴趣的朋友看看这本书,从头到尾没有一个晦涩的单词,通俗易懂。而且后面几章作者通过一个实例小应用配合cake的一些特性进行了说明,这写特性有分页,ajax,认证机制,cookie,session,rss订阅。在这写应用中,cake都显得极为方便。正如那句话:a piece of cake。
本书是面向cakephp新手的书,看完后我觉得还需要对官方文档详细阅读后才能达到用cakephp来开发复杂应用的程度。因为用户群不同,这本书只是介绍了cake的一些基础理论,而了解了这写,使用者可以在官方文档中自助式查询需要的东西。
三/102
CodeIgniter 入门
终于花了1个半星期的时间看完了“CodeIgniter 1.7”这本书,300多页,不过内容还算丰富。从web开发的各个方面介绍了CodeIgniter这个PHP框架,章节的安排跟那本“Pro Drupal Development”类似。看完本书后,感觉codeigniter确实能弥补一些目前的PHP框架开发现状,目前来说基于PHP的CMS比较全,国外流行的有drupal,joomla,CMSMS等等,国内的就更数不胜数了。但提到framework,大家都想到zend framework,研究过一段时间这个框架,感觉过于庞大了,至于剩下的cakePHP,thinkPHP,国内的FleaPHP都没有涉及过,第一个接触的正式PHP框架(正式是针对drupal来说)就是CodeIgniter了。
使用drupal2年多,已经身心疲惫。总是感觉还不是那么的灵活,性能还不是那么的好,总想对它控制得更多,但我们能做的只有hook。不可否认,drupal在快速搭建一些中小型站点确实是不错的选择,模块很多,社区很活跃,但是如果用来开发一些大型的应用就显得力不从心了,比如我们开发一个万人活跃用户的SNS社区,一个多应用服务器架构的系统。drupal本身是面向过程的PHP通过HOOK机制组织起来的,这时我们就迫切需要一款MVC的面向对象设计的框架。codeigniter正是如此。
比较喜欢CI(codeigniter的简称)的一些设计理念,第一个就是从不强迫用户,CI为开发者提供了很多功能(helper,plugin,library等等),方便开发者,但它不强迫你使用这些功能,你完全可以自定义开发自己的功能模块,甚至可以很方便的集成第三方工具进来,不像drupal,你必须对drupal机制要很了解,才能做一些比较深入的工作。另外,CI的定制性很高,你可以参考CI的文档对其任意定制,足以迷惑用户是不是CI开发出来的站点。
网上有一个老外做的视频,20分钟用CI搭建一个blog系统,虽说有些夸张,但功能也太简陋了,不管是安全性还是UE都没有考虑太多,我做过一个测试,3-4个小时开发出来一套多用户blog系统是完全可行的。
此外,CI为我们提供了很多类库,涵盖的功能如下:
- 文件下载
- 邮件发送,可包含附件
- 表单
- FTP
- 分页
。。。
CodeIgniter,值得学习。

