最新memcache 扩展(教大家开始PHP扩展之旅)
时间:2008-05-06
来源:互联网
mc_connect()
mc_set()
mc_get()
mc_delete()
mc_flush()
mc_quit()
mc_close()
等基本函数。
先上包包:

安装前需要先安装libmemcached 库 ,因为这个扩展是基于最新的libmemcached 库开发的。
代码后面慢慢讲解!!!!!
最后要实现的就是压缩算法。 算法已经选好。 gzlib 算法。 有空了就加上去。
同时在这里谢谢6间房网的toplee大哥对我的指点。忠心感谢。
[ 本帖最后由 逆雪寒 于 2008-5-6 14:33 编辑 ]
作者: 逆雪寒 发布时间: 2008-05-05

我写扩展的环境是 linux , php5.2.5 apache2 ,vim 就这么简单
我们生成扩展环境后。就可以看到mc.c文件。这里主要是我们写扩展的文件。首先我们必须定义我们自己的扩展函数名。需要用PHP_FE() 来定义。如果不定义PHP会认不出我们的函数。
看图。我的这个memcache 扩展。写了几个简单的函数 :
上面定义了 mc_connect()连接mc的函数 mc_set() 把对象或数组或字符等存到memcache 内存的函数。 mc_get() 从memcache 内存获取数值 mc_delete() 干掉内存中我们保存的东西。 mc_flush() 清楚内存中我们保存的数据。 mc_quit() 断开mc连接。 mc_close() 关闭 mc资源
下面我们先讲解第一个函数 mc_connect() 连接函数。这个函数可能是最难的一个了。因为涉及到资源。
我们先自定义一个我们自己的函数。这个还不是PHP意义上的函数。只是我们的一个在C文件里自定义的一个函数。要想成为PHP的函数。那还需要这样:
PHP扩展中。PHP的函数需要用 PHP_FUNCTION 这个宏函数来定义声明。其实所有的逻辑多可以在 PHP_FUNCTION(mc_connect){} 里面实现。但这样做是为了以后更好的扩展。
看 _mc_connect() 这个函数 的 INTERNAL_FUNCTION_PARAMETERS 宏参数。这个参数是PHP 里面给我们定义的宏。因为我们函数 _mc_connect() 需要接受 PHP层 的参数。 但这个函数又不属于PHP 的函数。所以我们需要使用 INTERNAL_FUNCTION_PARAMETERS 宏来创建 PHP函数的环境。
PHP代码:
_mc_connect(INTERNAL_FUNCTION_PARAMETERS){ }PHP代码:
ZEND_NUM_ARGS()PHP代码:
int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, ...);PHP代码:
char *hostname;long port;
int s_len;
int args = ZEND_NUM_ARGS();
zend_parse_parameters(args TSRMLS_CC,"sl", &hostname,&s_len,&port)==FAILURE
参数: 字符指针 hostname 是 MC服务器地址 . s_len 当然是字符长度拉。不废话。 port 很简单是 MC服务器端口拉。
OK。这个讲解完了继续
TSRMLS_CC 这个鸟是在多线程的服务器上。为了线程安全的宏。太高级了。我们不鸟。跳过。
"sl" 这个又是什么东西呢。 s 代表我们接受的第一个参数是字符形的 l 当表我们接受 长整形的。 C语言就是类型很严格。还是PHP爽。那里还管你什么鸟类型。 类型一定要对哦。要不会出现错误。
如果用户输入参数过多。或是类型不对。那么我们就用宏 :
WRONG_PARAM_COUNT;
来发出一个错误。看E文就知道。就是说 参数个数太多了。
如果用户输入参数正确。那么我们就可以 做进一步的处理了。就是拿那些参数的值做我们想做的事。
我们拿什么操作memcache 呢? 我选择了比较新的libmemcached 库。 所以我们也要懂这个库。这个是C语言中操作memcache 的一个库。下面我们来简单的看下这个库
PHP代码:
memcached_st *yhm_memc;memcached_return yhm_rc;
memcached_return 呢 这个是来接受返回结果的。结果有 MEMCACHED_SUCCESS 等等信息。
看下怎么用。我们用libmemcached 来连接memcache :
PHP代码:
yhm_memc = memcached_create(NULL);yhm_rc = memcached_server_add(yhm_memc,hostname,port);
memcached_server_add 这个才是主菜。大家看就知道了。 它是用来连接mc服务器的。
memcached_server_add(yhm_memc,hostname,port); hostname 和port 两个变量都是用户输入的。上面有讲解。就这样。 mc在PHP扩展中给连接了。 yhm_memc 这个变量很重要。因为我们连接了MC后。这个变量成了资源。我们在以后的扩展函数中都需要用到。所以存在一个资源保存的问题。
资源怎么保存呢。怎么给每个扩展中的函数使用呢。在注册资源的时候我们需要先在我们这个MC模块启动的时候就注册一个资源注销函数,方便让模块卸载的时候调用清除MC资源
_close_mc_link 函数是我们自定义的 参数: zend_rsrc_list_entry *rsrc TSRMLS_DC 是一个结构体:里面保存着我们的资源。大概鸟样是这样的:
PHP代码:
typedef struct _zend_rsrc_list_entry {void *ptr;
int type;
int refcount;
} zend_rsrc_list_entry;
其实我们不用管那么多。用就是了。
PHP代码:
memcached_st *link = (memcached_st *)rsrc->ptr;memcached_quit(link);
注册到内核我们使用:
PHP代码:
le_link=zend_register_list_destructors_ex(_close_mc_link,NULL,RESOURCE_TAG,module_number);le_link 静态变量就是我们在注册函数析构函数时返回的资源类型句柄。
资源名 宏RESOURCE_TAG 定义为 yhm_mc 也就是这个资源 var_dump() 的名字为yhm_mc : 看下var_dump() 后的显示
PHP代码:
resource(2) of type (yhm_mc)因为常用到所以我再一次封装成自己的宏:
PHP代码:
#define YHM_REGISTER_RESOURCE(lk) \{
zend_register_resource(return_value,lk,le_link);
}
OK。大家都了解了吧。我们回到 PHP_FUNCTION(mc_connect) 函数里。里面有这么段:
PHP代码:
yhm_memc = memcached_create(NULL);yhm_rc = memcached_server_add(yhm_memc,hostname,port);
if(yhm_rc == MEMCACHED_SUCCESS){
YHM_REGISTER_RESOURCE(yhm_memc);
}else{
RETURN_FALSE;
}
OK。粗略讲完了这个函数。 学扩展需要先看一遍扩展的手册。最好这样拉。要不会有点郁闷。



[ 本帖最后由 逆雪寒 于 2008-5-6 11:18 编辑 ]
作者: PHPChina 发布时间: 2008-05-05
作者: 逆雪寒 发布时间: 2008-05-05
作者: 逆雪寒 发布时间: 2008-05-05

作者: Phzzy 发布时间: 2008-05-06
作者: 肥同小可 发布时间: 2008-05-06
C没白学
作者: fyland 发布时间: 2008-05-06

作者: 七月十五 发布时间: 2008-05-06
作者: ct_174880859 发布时间: 2008-05-06
作者: pylong 发布时间: 2008-05-07
作者: chyoqin 发布时间: 2008-05-07
作者: 清竹�w翔 发布时间: 2008-05-07
作者: glem 发布时间: 2008-05-07
作者: go_tit 发布时间: 2008-05-07
身份证拿出来??
作者: 逆雪寒 发布时间: 2008-05-07
作者: mara1129 发布时间: 2008-05-07

toplee 大哥技术挺硬的
作者: naodai 发布时间: 2008-05-08
引用:
原帖由 linvo 于 2008-5-8 00:19 发表扩展手册? 哪里有下?
toplee大哥也来帮我顶了。呵呵。

[ 本帖最后由 逆雪寒 于 2008-5-8 17:32 编辑 ]
作者: linvo 发布时间: 2008-05-08
作者: edwardhey 发布时间: 2008-05-08

作者: 9tmd 发布时间: 2008-05-08
作者: hbclare 发布时间: 2008-05-08



作者: lxylxy888666 发布时间: 2008-05-09

作者: lzjyrg 发布时间: 2008-05-09
作者: 逆雪寒 发布时间: 2008-05-11
非常感谢
作者: richardhc 发布时间: 2008-07-20
作者: ginux 发布时间: 2008-07-21
作者: leric 发布时间: 2008-07-21

作者: fyp83 发布时间: 2008-07-25
作者: xilo 发布时间: 2008-08-01
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28