Tags
-
Recent Posts
Recent Comments
Categories
Archives
Links
Tools
Meta
Author Archives: James Tang
Drupal架构与实现分析
不尽知用兵之害者,则不能尽知用兵之利——孙武《孙子兵法》 Drupal也算是架构精良的PHP开源CMS,它最大的优点是可以灵活性高,不仅可以用于实现一般的CMS功能,还可以容易的实现其它应用,如Drupal官方所说,可以实现wiki, blog甚至商城等.它最大的问题是灵活性太高,如果没有根据实际情况进行设计与管理,后果会很糟糕。 先看一下Drupal的总体架构,下图是Drupal官方的信息流图,详细参见:http://drupal.org/getting-started/before/overview。 从图上看起来非常清晰明了,不过这并没有体现出Drupal的架构方式。在我看来Drupal的基本架构就是Drupal核心+模块+模板,所谓的Drupal核心除模块之外的最基础的代码,全部在includes目录下面,另外Drupal有几个核心模块,如System, User, Node等。 Drupal的处理流程如下: 系统初始化 路径解析(路由) 页面内容渲染 页面布局及block渲染 生成页面 1. Hook Drupal几乎是纯面向过程的架构,这或许让很多习惯OOP的人有点惊讶,这或许也是Drupal变得难以管理(源码,模块)的原因。Hook是Drupal架构实现的关键,模块通过种hook与Drupal进行交互,这种方式被称为基于过程的AOP[1]。 大多数情况下,Drupal通过module_invoke_all()来调用指定的hooks, 如下面代码将调用所有MODULE_NAME_cron()这样的函数: module_invoke_all(‘cron’); 下面是module_invoke_all()的源码,参数通过func_get_args函数获得,返回值是可选的。顺便提一下,在Drupal及其模块中经常用到func_get_args函数。 function module_invoke_all() { $args = func_get_args(); $hook = $args[0]; unset($args[0]); $return = array(); foreach (module_implements($hook) as $module) { $function = … Continue reading
Tools for testing REST API
1. CURL curl是一个很强大很实用的工具: curl -v -X POST -H “Content-Type: application/json” -H “Accept: application/json” -d ‘{“id”:1, “method”:”message.query”, “jsonrpc”:”2.0″, “params”: {“user_id”:9} }’ http://fwso.cn/services/json-rpc 2. REST Client WizTools.org RESTClient是一个用Java写的工具, Swing界面,使用比较方便: 3. WFetch Windows下可以使用微软的WFetch, 功能比较齐全,但感觉不是很好用。
PHP in_array()与array_search的实现
今天看PHP源码的时候发现in_array与array_search是通过同一个函数php_search_array来实现的,只是最后一个参数不同. in_array的实现: PHP_FUNCTION(in_array) { php_search_array(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); } array_search的实现: PHP_FUNCTION(array_search) { php_search_array(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } php_search_array的代码: static void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */ { zval *value, /* value to check for */ *array, /* array to check in */ **entry, /* … Continue reading
查找数组中的唯一元素
问题 例如给定一个数组有101个元素,其实50个元素出现再次,只有一个仅出现一次,写一个函数找出该唯一的元素,元素均为整型。 1. 最差的方法 前提是元素都大于0. int findOdd(int *input, int len) { int i, j, z, *buff, blen = (int) (len / 2 + 1); buff = (int *) malloc(sizeof(int) * blen); for (i = 0; i < len; i++) { … Continue reading
数码照片EXIF信息读取(PHP)
EXIF(Exchangeable image file format)是数码相机用于记录图片属性及拍摄数据的标准,最初由日本电子工业发展协会制定。这些信息是可以修改的,因此这些数据只有参考价值。在Windows下查看图片属性可以看到并修改这些信息,下图是在Picasa中看到的部分信息: Exif扩展 PHP的Exif扩展用于处理这些信息,在编译PHP时–enable-exif即可。该简单比较简单,一共只有5个函数(准确地说只有4个,因为read_exif_data只是exif_read_data的别名),本文主要使用exif_read_data()与exif_thumbnail(). string exif_thumbnail ( string $filename [, int &$width [, int &$height [, int &$imagetype ]]] ) exif_thumbnail读取图片的缩略图,后面三个可选参数分别用于返回缩略图的宽、高及图片类型,图片类型是整型,如2代表JPEG格式(参考exif_imagetype),GD扩展提供了image_type_to_mime_type()函数可以方便地返回对应的mime类型。 array exif_read_data ( string $filename [, string $sections = NULL [, bool $arrays = false [, bool … Continue reading