Skip to content

Commit f733d2d

Browse files
committed
Added support for persistance inside session that can be turned on by starting
the session.save_path INI setting with PERSISTENT=[persistent id]. Added support for memcached server config string
1 parent 09d5c51 commit f733d2d

File tree

3 files changed

+88
-31
lines changed

3 files changed

+88
-31
lines changed

php_memcached.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,6 @@ enum {
207207
MEMC_OP_PREPEND
208208
};
209209

210-
static int le_memc;
211-
212210
static zend_class_entry *memcached_ce = NULL;
213211
static zend_class_entry *memcached_exception_ce = NULL;
214212

@@ -299,7 +297,6 @@ PHP_INI_END()
299297
/****************************************
300298
Forward declarations
301299
****************************************/
302-
static int php_memc_list_entry(void);
303300
static int php_memc_handle_error(php_memc_t *i_obj, memcached_return status TSRMLS_DC);
304301
static char *php_memc_zval_to_payload(zval *value, size_t *payload_len, uint32_t *flags, enum memcached_serializer serializer, enum memcached_compression_type compression_type TSRMLS_DC);
305302
static int php_memc_zval_from_payload(zval *value, char *payload, size_t payload_len, uint32_t flags, enum memcached_serializer serializer TSRMLS_DC);
@@ -386,11 +383,6 @@ static PHP_METHOD(Memcached, __construct)
386383
plist_key_len = spprintf(&plist_key, 0, "memcached:id=%s", persistent_id);
387384
plist_key_len += 1;
388385

389-
if (plist_key == NULL) {
390-
php_error_docref(NULL TSRMLS_CC, E_ERROR, "out of memory: cannot allocate persistent list handler");
391-
/* not reached */
392-
}
393-
394386
if (zend_hash_find(&EG(persistent_list), plist_key, plist_key_len, (void *)&le) == SUCCESS) {
395387
if (le->type == php_memc_list_entry()) {
396388
m_obj = (struct memc_obj *) le->ptr;
@@ -2900,11 +2892,6 @@ static int php_memc_zval_from_payload(zval *value, char *payload, size_t payload
29002892
return -1;
29012893
}
29022894

2903-
static int php_memc_list_entry(void)
2904-
{
2905-
return le_memc;
2906-
}
2907-
29082895
static void php_memc_init_globals(zend_php_memcached_globals *php_memcached_globals_p TSRMLS_DC)
29092896
{
29102897
#ifdef HAVE_MEMCACHED_SESSION

php_memcached.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ PHP_MINFO_FUNCTION(memcached);
9898
#define MEMC_G(v) (php_memcached_globals.v)
9999
#endif
100100

101+
static int le_memc;
102+
103+
static int php_memc_list_entry(void)
104+
{
105+
return le_memc;
106+
}
107+
101108
#endif /* PHP_MEMCACHED_H */
102109

103110

php_memcached_session.c

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,35 +99,98 @@ static void php_memc_sess_unlock(memcached_st *memc TSRMLS_DC)
9999
PS_OPEN_FUNC(memcached)
100100
{
101101
memcached_st *memc_sess = PS_GET_MOD_DATA();
102-
memcached_server_st *servers;
103102
memcached_return status;
103+
char *p, *plist_key = NULL;
104+
int plist_key_len;
104105

105-
servers = memcached_servers_parse((char *)save_path);
106-
if (servers) {
107-
memc_sess = memcached_create(NULL);
108-
if (memc_sess) {
109-
status = memcached_server_push(memc_sess, servers);
110-
memcached_server_list_free(servers);
111-
112-
if (memcached_callback_set(memc_sess, MEMCACHED_CALLBACK_PREFIX_KEY, MEMC_G(sess_prefix)) != MEMCACHED_SUCCESS) {
113-
PS_SET_MOD_DATA(NULL);
114-
memcached_free(memc_sess);
115-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "bad memcached key prefix in memcached.sess_prefix");
116-
return FAILURE;
117-
}
106+
if (!strncmp((char *)save_path, "PERSISTENT=", sizeof("PERSISTENT=") - 1)) {
107+
zend_rsrc_list_entry *le = NULL;
108+
char *e;
118109

119-
if (status == MEMCACHED_SUCCESS) {
110+
p = (char *)save_path + sizeof("PERSISTENT=") - 1;
111+
if (!*p) {
112+
error:
113+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid persistent id for session storage");
114+
return FAILURE;
115+
}
116+
if ((e = strchr(p, ' '))) {
117+
plist_key_len = spprintf(&plist_key, 0, "memcached_sessions:id=%.*s", (int)(e - p), p);
118+
} else {
119+
goto error;
120+
}
121+
plist_key_len++;
122+
if (zend_hash_find(&EG(persistent_list), plist_key, plist_key_len, (void *)&le) == SUCCESS) {
123+
if (le->type == php_memc_list_entry()) {
124+
memc_sess = (struct memc_obj *) le->ptr;
120125
PS_SET_MOD_DATA(memc_sess);
121126
return SUCCESS;
122127
}
128+
}
129+
p = e + 1;
130+
} else {
131+
p = (char *)save_path;
132+
}
133+
134+
if (!strstr(p, "--SERVER")) {
135+
memcached_server_st *servers = memcached_servers_parse(p);
136+
if (servers) {
137+
memc_sess = memcached_create(NULL);
138+
if (memc_sess) {
139+
status = memcached_server_push(memc_sess, servers);
140+
memcached_server_list_free(servers);
141+
142+
if (memcached_callback_set(memc_sess, MEMCACHED_CALLBACK_PREFIX_KEY, MEMC_G(sess_prefix)) != MEMCACHED_SUCCESS) {
143+
PS_SET_MOD_DATA(NULL);
144+
if (plist_key) {
145+
efree(plist_key);
146+
}
147+
memcached_free(memc_sess);
148+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "bad memcached key prefix in memcached.sess_prefix");
149+
return FAILURE;
150+
}
151+
152+
if (status == MEMCACHED_SUCCESS) {
153+
goto success;
154+
}
155+
} else {
156+
memcached_server_list_free(servers);
157+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not allocate libmemcached structure");
158+
}
123159
} else {
124-
memcached_server_list_free(servers);
125-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not allocate libmemcached structure");
160+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to parse session.save_path");
126161
}
127162
} else {
128-
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to parse session.save_path");
163+
memc_sess = memcached(p, strlen(p));
164+
if (!memc_sess) {
165+
char error_buffer[1024];
166+
if (libmemcached_check_configuration(p, strlen(p), error_buffer, sizeof(error_buffer)) != MEMCACHED_SUCCESS) {
167+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "session.save_path configuration error %s", error_buffer);
168+
} else {
169+
php_error_docref(NULL TSRMLS_CC, E_WARNING, "failed to initialize memcached session storage");
170+
}
171+
} else {
172+
success:
173+
PS_SET_MOD_DATA(memc_sess);
174+
175+
if (plist_key) {
176+
zend_rsrc_list_entry le;
177+
178+
le.type = php_memc_list_entry();
179+
le.ptr = memc_sess;
180+
181+
if (zend_hash_update(&EG(persistent_list), (char *)plist_key, plist_key_len, (void *)&le, sizeof(le), NULL) == FAILURE) {
182+
efree(plist_key);
183+
php_error_docref(NULL TSRMLS_CC, E_ERROR, "could not register persistent entry");
184+
}
185+
efree(plist_key);
186+
}
187+
return SUCCESS;
188+
}
129189
}
130190

191+
if (plist_key) {
192+
efree(plist_key);
193+
}
131194
PS_SET_MOD_DATA(NULL);
132195
return FAILURE;
133196
}

0 commit comments

Comments
 (0)