/*
+----------------------------------------------------------------------+
| Copyright (c) 2009-2010 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Andrei Zmievski <andrei@php.net> |
+----------------------------------------------------------------------+
*/
/* $ Id: $ */
/* TODO
* - set LIBKETAMA_COMPATIBLE as the default?
* - fix unserialize(serialize($memc))
*/
#include "php_memcached.h"
#include "php_memcached_private.h"
#include "php_memcached_server.h"
#include "g_fmt.h"
#include <ctype.h>
#include <limits.h>
#ifdef HAVE_MEMCACHED_SESSION
# include "php_memcached_session.h"
#endif
#ifdef HAVE_FASTLZ_H
#include <fastlz.h>
#else
#include "fastlz/fastlz.h"
#endif
#include <zlib.h>
#ifdef HAVE_JSON_API
# include "ext/json/php_json.h"
#endif
#ifdef HAVE_MEMCACHED_IGBINARY
# include "ext/igbinary/igbinary.h"
#endif
#ifdef HAVE_MEMCACHED_MSGPACK
# include "ext/msgpack/php_msgpack.h"
#endif
static int le_memc;
static int php_memc_list_entry(void) {
return le_memc;
}
/****************************************
Protocol parameters
****************************************/
#define MEMC_OBJECT_KEY_MAX_LENGTH 250
/****************************************
Custom options
****************************************/
#define MEMC_OPT_COMPRESSION -1001
#define MEMC_OPT_PREFIX_KEY -1002
#define MEMC_OPT_SERIALIZER -1003
#define MEMC_OPT_COMPRESSION_TYPE -1004
#define MEMC_OPT_STORE_RETRY_COUNT -1005
#define MEMC_OPT_USER_FLAGS -1006
/****************************************
Custom result codes
****************************************/
#define MEMC_RES_PAYLOAD_FAILURE -1001
/****************************************
Payload value flags
****************************************/
#define MEMC_CREATE_MASK(start, n_bits) (((1 << n_bits) - 1) << start)
#define MEMC_MASK_TYPE MEMC_CREATE_MASK(0, 4)
#define MEMC_MASK_INTERNAL MEMC_CREATE_MASK(4, 12)
#define MEMC_MASK_USER MEMC_CREATE_MASK(16, 16)
#define MEMC_VAL_GET_TYPE(flags) ((flags) & MEMC_MASK_TYPE)
#define MEMC_VAL_SET_TYPE(flags, type) ((flags) |= ((type) & MEMC_MASK_TYPE))
#define MEMC_VAL_IS_STRING 0
#define MEMC_VAL_IS_LONG 1
#define MEMC_VAL_IS_DOUBLE 2
#define MEMC_VAL_IS_BOOL 3
#define MEMC_VAL_IS_SERIALIZED 4
#define MEMC_VAL_IS_IGBINARY 5
#define MEMC_VAL_IS_JSON 6
#define MEMC_VAL_IS_MSGPACK 7
#define MEMC_VAL_COMPRESSED (1<<0)
#define MEMC_VAL_COMPRESSION_ZLIB (1<<1)
#define MEMC_VAL_COMPRESSION_FASTLZ (1<<2)
#define MEMC_VAL_GET_FLAGS(internal_flags) (((internal_flags) & MEMC_MASK_INTERNAL) >> 4)
#define MEMC_VAL_SET_FLAG(internal_flags, internal_flag) ((internal_flags) |= (((internal_flag) << 4) & MEMC_MASK_INTERNAL))
#define MEMC_VAL_HAS_FLAG(internal_flags, internal_flag) ((MEMC_VAL_GET_FLAGS(internal_flags) & (internal_flag)) == (internal_flag))
#define MEMC_VAL_DEL_FLAG(internal_flags, internal_flag) (internal_flags &= (~(((internal_flag) << 4) & MEMC_MASK_INTERNAL)))
/****************************************
User-defined flags
****************************************/
#define MEMC_VAL_GET_USER_FLAGS(flags) ((flags & MEMC_MASK_USER) >> 16)
#define MEMC_VAL_SET_USER_FLAGS(flags, udf_flags) ((flags) |= ((udf_flags << 16) & MEMC_MASK_USER))
#define MEMC_VAL_USER_FLAGS_MAX ((1 << 16) - 1)
/****************************************
"get" operation flags
****************************************/
#define MEMC_GET_PRESERVE_ORDER 1
#define MEMC_GET_EXTENDED 2
/****************************************
Helper macros
****************************************/
#define RETURN_FROM_GET RETURN_FALSE
/****************************************
Structures and definitions
****************************************/
typedef enum {
MEMC_OP_SET,
MEMC_OP_TOUCH,
MEMC_OP_ADD,
MEMC_OP_REPLACE,
MEMC_OP_APPEND,
MEMC_OP_PREPEND
} php_memc_write_op;
typedef struct {
zend_bool is_persistent;
zend_bool compression_enabled;
zend_bool encoding_enabled;
zend_long serializer;
zend_long compression_type;
zend_long store_retry_count;
zend_long set_udf_flags;
#ifdef HAVE_MEMCACHED_SASL
zend_bool has_sasl_data;
#endif
} php_memc_user_data_t;
typedef struct {
memcached_st *memc;
zend_bool is_pristine;
int rescode;
int memc_errno;
zend_object zo;
} php_memc_object_t;
typedef struct {
size_t num_valid_keys;
const char **mkeys;
size_t *mkeys_len;
zend_string **strings;
} php_memc_keys_t;
typedef struct {
zval *object;
zend_fcall_info fci;
zend_fcall_info_cache fcc;
} php_memc_result_callback_ctx_t;
static inline php_memc_object_t *php_memc_fetch_object(zend_object *obj) {
return (php_memc_object_t *)((char *)obj - XtOffsetOf(php_memc_object_t, zo));
}
#define Z_MEMC_OBJ_P(zv) php_memc_fetch_object(Z_OBJ_P(zv));
#define MEMC_METHOD_INIT_VARS \
zval* object = getThis(); \
php_memc_object_t* intern = NULL; \
php_memc_user_data_t* memc_user_data = NULL;
#define MEMC_METHOD_FETCH_OBJECT \
intern = Z_MEMC_OBJ_P(object); \
if (!intern->memc) { \
php_error_docref(NULL, E_WARNING, "Memcached constructor was not called"); \
return; \
} \
memc_user_data = (php_memc_user_data_t *) memcached_get_user_data(intern->memc); \
(void)memc_user_data; /* avoid unused variable warning */
static
zend_bool s_memc_valid_key_binary(zend_string *key)
{
return memchr(ZSTR_VAL(key), '\n', ZSTR_LEN(key)) == NULL;
}
static
zend_bool s_memc_valid_key_ascii(zend_string *key)
{
const char *str = ZSTR_VAL(key);
size_t i, len = ZSTR_LEN(key);
for (i = 0; i < len; i++) {
if (iscntrl(str[i]) || isspace(str[i]))
return 0;
}
return 1;
}
#define MEMC_CHECK_KEY(intern, key) \
if (UNEXPECTED(ZSTR_LEN(key) == 0 || \
ZSTR_LEN(key) > MEMC_OBJECT_KEY_MAX_LENGTH || \
(memcached_behavior_get(intern->memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL) \
? !s_memc_valid_key_binary(key) \
: !s_memc_valid_key_ascii(key) \
))) { \
intern->rescode = MEMCACHED_BAD_KEY_PROVIDED; \
RETURN_FALSE; \
}
#ifdef HAVE_MEMCACHED_PROTOCOL
typedef struct {
php_memc_proto_handler_t *handler;
zend_object zo;
} php_memc_server_t;
static inline php_memc_server_t *php_memc_server_fetch_object(zend_object *obj) {
return (php_memc_server_t *)((char *)obj - XtOffsetOf(php_memc_server_t, zo));
}
#define Z_MEMC_SERVER_P(zv) php_memc_server_fetch_object(Z_OBJ_P(zv))
static zend_object_handlers memcached_server_object_handlers;
static zend_class_entry *memcached_server_ce = NULL;
#endif
static zend_class_entry *memcached_ce = NULL;
static zend_c
没有合适的资源?快使用搜索试试~ 我知道了~
memcached支持 PHP 7.0 - 7.2
共172个文件
phpt:137个
h:7个
c:6个
1星 需积分: 21 13 下载量 191 浏览量
2018-05-23
10:57:10
上传
评论
收藏 156KB ZIP 举报
温馨提示
php-memcached 3.x: Supports PHP 7.0 - 7.2. Requires libmemcached 1.x or higher. Optionally supports igbinary 2.0 or higher. Optionally supports msgpack 2.0 or higher.
资源推荐
资源详情
资源评论
收起资源包目录
memcached支持 PHP 7.0 - 7.2 (172个子文件)
php_memcached.c 133KB
php_memcached_server.c 24KB
php_memcached_session.c 14KB
fastlz.c 13KB
php_libmemcached_compat.c 3KB
g_fmt.c 2KB
ChangeLog 10KB
CREDITS 59B
.cvsignore 499B
.gitignore 832B
php_memcached_private.h 6KB
fastlz.h 3KB
php_memcached.h 2KB
php_libmemcached_compat.h 2KB
php_memcached_session.h 2KB
php_memcached_server.h 1KB
g_fmt.h 1KB
types.inc 3KB
config.inc 2KB
skipif.inc 394B
memcached.ini 6KB
LICENSE 3KB
LICENSE 1KB
config.m4 15KB
README.markdown 2KB
memcached-api.php 7KB
run-server.php 4KB
set-get-server.php 1KB
test-server.php 603B
set-get.php 368B
compression_conditions.phpt 4KB
keys_binary.phpt 3KB
keys_ascii.phpt 3KB
user-flags.phpt 3KB
stats_hang.phpt 2KB
compression_types.phpt 2KB
touch_binary.phpt 2KB
gh_90.phpt 2KB
rescode.phpt 2KB
fetch.phpt 2KB
deletemulti.phpt 2KB
session_lock-php71.phpt 2KB
invoke_callback_2.phpt 1KB
session_lock.phpt 1KB
incrdecr_bykey.phpt 1KB
serializer_php_bad_serialize.phpt 1KB
incrdecr.phpt 1KB
set_encoding_key.phpt 1KB
expire.phpt 1KB
get_bykey_cas.phpt 1KB
options.phpt 1KB
set_default_serializer.phpt 1KB
bug_16959.phpt 1KB
gh_155.phpt 1KB
vbucket.phpt 1KB
cachecallback.phpt 1KB
getdelayed_bykey_cas.phpt 1KB
setmulti.phpt 1KB
stats.phpt 1KB
get_flags.phpt 1KB
getdelayed.phpt 1KB
getdelayed_nonstring_keys.phpt 1KB
incrdecr_initial.phpt 1KB
serializer_php_bad_unserialize.phpt 1KB
delete_bykey.phpt 1KB
getdelayed_bykey.phpt 1KB
setoptions.phpt 1KB
getdelayed_badunserialize.phpt 1KB
set_encoding_key2.phpt 1KB
session_lazy_warning.phpt 1KB
getserverbykey.phpt 1023B
cas_multi.phpt 1012B
getserverlist.phpt 1012B
fetchall_badunserialize.phpt 997B
add_bykey.phpt 996B
fetch_badunserialize.phpt 994B
setmulti_badserialize.phpt 988B
callback_exception_2.phpt 976B
set_bykey.phpt 945B
get_udp.phpt 923B
bug_17137.phpt 921B
deletemulti_nonstringkeys.phpt 920B
setmulti_bykey.phpt 915B
callback_exception.phpt 903B
getmulti.phpt 865B
gh_93.phpt 863B
getmulti_badunserialize.phpt 835B
default_behavior.phpt 826B
set_invalid_serializer.phpt 816B
incrdecr_64.phpt 807B
session_gc.phpt 801B
reset_keyprefix.phpt 800B
check_if_persistent.phpt 795B
session_badconf_servers-php72.phpt 771B
sasl_basic.phpt 757B
extreme_floats.phpt 741B
session_basic3.phpt 735B
cas_bykey.phpt 732B
bad_construct.phpt 727B
session_basic2.phpt 726B
共 172 条
- 1
- 2
资源评论
- 木木小马2018-09-26只是网上下载的源代码,并没有打包成dll文件
- csdncb2018-12-22非memcached实为memcache
野猪向前冲
- 粉丝: 0
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功