memcache扩展0.2版本和0.4版本差异(二)
来源:互联网 发布:手机淘宝打折 编辑:程序博客网 时间:2024/06/03 09:39
看看get_version的代码
PHP_FUNCTION(memcache_get_version)
{
mmc_t *mmc;
int inx;
char *version;
zval *mmc_object = getThis();
if (mmc_object == NULL) {
if (zend_get_parameters(ht, 1, &mmc_object) == FAILURE) {
WRONG_PARAM_COUNT;
}
}
注:注意这里多了一个参数,也就是如果当前不是对象调用,传递对象地址也能取到版本信息
if ((inx = mmc_get_connection(mmc_object, &mmc TSRMLS_CC)) == 0) {
RETURN_FALSE;
}
if ( (version = mmc_get_version(mmc TSRMLS_CC)) ) {
RETURN_STRING(version, 0);
}
RETURN_FALSE;
}
add ,set, replace三个方法依然走的同一个代码-php_mmc_store,不过php_mmc_store方法比0.2版本多了一个参数,命令的长度,虽然本人觉得这个参数根本不需要,方法应内聚,这个参数完全可以在本方法里用strlen取出来,继续
先补充个宏:#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
static void php_mmc_store (INTERNAL_FUNCTION_PARAMETERS, char *command, int command_len)
{
mmc_t *mmc;
int inx, data_len = 0, real_expire = 0, real_flags = 0, key_len;
char *data = NULL, *real_key;
int ac = ZEND_NUM_ARGS();
zval *key, *var, *flags, *expire, *mmc_object = getThis();
php_serialize_data_t var_hash;
smart_str buf = {0};
if (mmc_object == NULL) {
注:非对象调用,在0.2版本里是不允许非对象调用的,现在允许了
if (ac < 3 || ac > 5 || zend_get_parameters(ht, ac, &mmc_object, &key, &var, &flags, &expire) == FAILURE) {
WRONG_PARAM_COUNT;
}
注:参数个数3-5个,也就是:对象在内存中地址,key,value,flags,过期时间
if (ac == 4) {
convert_to_long(flags);
real_flags = Z_LVAL_P(flags);
}
注:传了flags,将其转为整形
if (ac == 5) {
convert_to_long(expire);
real_expire = Z_LVAL_P(expire);
}
注:转换过期时间为整形
}
else {
if (ac < 2 || ac > 4 || zend_get_parameters(ht, ac, &key, &var, &flags, &expire) == FAILURE) {
WRONG_PARAM_COUNT;
}
注:允许参数个数2-4个,对象调用,不需要传对象地址,只传key,value,flags,过期时间
if (ac == 3) {
convert_to_long(flags);
real_flags = Z_LVAL_P(flags);
}
注:同上,相同功能的冗余代码如此之多…………
if (ac == 4) {
convert_to_long(expire);
real_expire = Z_LVAL_P(expire);
}
注:不说啥了………………
}
if ((inx = mmc_get_connection(mmc_object, &mmc TSRMLS_CC)) == 0) {
RETURN_FALSE;
}
注:根据对象内存地址取对象,取不到,false
convert_to_string(key);
if (Z_STRLEN_P(key) > MMC_KEY_MAX_SIZE) {
real_key = estrndup(Z_STRVAL_P(key), MMC_KEY_MAX_SIZE);
key_len = MMC_KEY_MAX_SIZE;
}
注:key的长度限制依然是250
else {
real_key = estrdup(Z_STRVAL_P(key));
key_len = Z_STRLEN_P(key);
注:尽量用宏,不要用原生的C,切记………
}
switch (Z_TYPE_P(var)) {
case IS_STRING:
case IS_LONG:
case IS_DOUBLE:
case IS_BOOL:
convert_to_string(var);
if (real_flags & MMC_COMPRESSED) {
if (!mmc_compress(&data, &data_len, Z_STRVAL_P(var), Z_STRLEN_P(var) TSRMLS_CC)) {
RETURN_FALSE;
}
}
else {
data = Z_STRVAL_P(var);
data_len = Z_STRLEN_P(var);
}
break;
default:
PHP_VAR_SERIALIZE_INIT(var_hash);
php_var_serialize(&buf, &var, &var_hash TSRMLS_CC);
PHP_VAR_SERIALIZE_DESTROY(var_hash);
if (!buf.c) {
/* you're trying to save null or smthing went really wrong */
RETURN_FALSE;
}
real_flags |= MMC_SERIALIZED;
data = buf.c;
data_len = buf.len;
break;
}
注:上面是准备数据,上一版本介绍过
if (mmc_exec_storage_cmd(mmc, command, command_len, real_key, key_len, real_flags, real_expire, data, data_len TSRMLS_CC) > 0) {
if (real_flags & MMC_SERIALIZED) {
smart_str_free(&buf);
}
efree(real_key);
RETURN_TRUE;
}
注:存储操作
if (real_flags & MMC_SERIALIZED) {
smart_str_free(&buf);
}
efree(real_key);
注:释放内存,切记
RETURN_FALSE;
}
- memcache扩展0.2版本和0.4版本差异(二)
- memcache扩展0.2版本和0.4版本差异(一)
- memcache扩展(0.2版本)源代码讲解(memcache_connect)
- memcache扩展(0.2版本)源代码讲解(memcache_get_version)
- memcache扩展(0.2版本)源代码讲解(memcache_set)
- memcache扩展(0.2版本)源代码讲解(memcache_get)
- memcache扩展(0.2版本)源代码讲解(memcache_delete)
- memcache扩展(0.2版本)源代码讲解(memcache_increment)
- DEBUG和RELEASE 版本差异
- DEBUG和RELEASE 版本差异
- DEBUG和RELEASE 版本差异
- windows phpinfo上不能找到memcache扩展 php版本5.6
- .Net Framework 基础和版本差异
- 不同版本iOS的特性和差异
- Python3.x和以前版本的差异
- alfresco repository 不同版本的代码统计和版本差异
- 开发iOS6和iphone5版本与之前版本差异总结
- android user版本和eng版本的差异介绍
- JSTL 核心标签库 使用
- 文字溢出自动加省略号 兼容IE8
- as.net 弹出页面代码及相关解释
- 经验来自学习之应用网络处理
- Codeforces 259 D 数位DP + 搜索
- memcache扩展0.2版本和0.4版本差异(二)
- C/C++ 不检查数组下标是否越界
- Dialog中的点击PositiveButton,Dialog不消失
- Java:设计模式之适配器模式Adapter
- class_device_create class_device_destroy
- 关联和依赖的区别
- Configuration Parameters
- jQuery新增函数之jQuery.isNumeric()
- Android - 文件读写操作 总结