--- memcache_session.c 2008-02-05 14:46:51.000000000 -0500 +++ ../memcache_session.c 2008-03-31 08:16:13.000000000 -0400 @@ -36,6 +36,8 @@ PS_MOD(memcache) }; +static int webid=0; // to distinguish between webservers which use same memcached server + /* {{{ PS_OPEN_FUNC */ PS_OPEN_FUNC(memcache) @@ -90,6 +92,12 @@ retry_interval = Z_LVAL_PP(param); } + /* hack */ + if (zend_hash_find(Z_ARRVAL_P(params), "web_id", sizeof("web_id"), (void **) ¶m) != FAILURE) { + convert_to_long_ex(param); + webid = Z_LVAL_PP(param); + } + zval_ptr_dtor(¶ms); } @@ -147,16 +155,21 @@ if (pool) { char key_tmp[MMC_KEY_MAX_SIZE]; + char key_tmp2[MMC_KEY_MAX_SIZE]; unsigned int key_tmp_len; if (mmc_prepare_key_ex(key, strlen(key), key_tmp, &key_tmp_len TSRMLS_CC) != MMC_OK) { return FAILURE; } + /* hack : assume key length never reach beyond MMC_KEY_MAX_SIZE */ + sprintf(key_tmp2,"%s%d",key_tmp,webid); + key_tmp_len=strlen(key_tmp2); + MAKE_STD_ZVAL(result); ZVAL_NULL(result); - if (mmc_exec_retrieval_cmd(pool, key_tmp, key_tmp_len, &result, NULL TSRMLS_CC) <= 0 || Z_TYPE_P(result) != IS_STRING) { + if (mmc_exec_retrieval_cmd(pool, key_tmp2, key_tmp_len, &result, NULL TSRMLS_CC) <= 0 || Z_TYPE_P(result) != IS_STRING) { zval_ptr_dtor(&result); return FAILURE; } @@ -179,13 +192,18 @@ if (pool) { char key_tmp[MMC_KEY_MAX_SIZE]; + char key_tmp2[MMC_KEY_MAX_SIZE]; unsigned int key_tmp_len; if (mmc_prepare_key_ex(key, strlen(key), key_tmp, &key_tmp_len TSRMLS_CC) != MMC_OK) { return FAILURE; } - if (mmc_pool_store(pool, "set", sizeof("set")-1, key_tmp, key_tmp_len, 0, INI_INT("session.gc_maxlifetime"), val, vallen TSRMLS_CC)) { + /* hack : assume key length never reach beyond MMC_KEY_MAX_SIZE */ + sprintf(key_tmp2,"%s%d",key_tmp,webid); + key_tmp_len=strlen(key_tmp2); + + if (mmc_pool_store(pool, "set", sizeof("set")-1, key_tmp2, key_tmp_len, 0, INI_INT("session.gc_maxlifetime"), val, vallen TSRMLS_CC)) { return SUCCESS; } } @@ -205,14 +223,19 @@ if (pool) { char key_tmp[MMC_KEY_MAX_SIZE]; + char key_tmp2[MMC_KEY_MAX_SIZE]; unsigned int key_tmp_len; if (mmc_prepare_key_ex(key, strlen(key), key_tmp, &key_tmp_len TSRMLS_CC) != MMC_OK) { return FAILURE; } - while (result < 0 && (mmc = mmc_pool_find(pool, key_tmp, key_tmp_len TSRMLS_CC)) != NULL) { - if ((result = mmc_delete(mmc, key_tmp, key_tmp_len, 0 TSRMLS_CC)) < 0) { + /* hack : assume key length never reach beyond MMC_KEY_MAX_SIZE */ + sprintf(key_tmp2,"%s%d",key_tmp,webid); + key_tmp_len=strlen(key_tmp2); + + while (result < 0 && (mmc = mmc_pool_find(pool, key_tmp2, key_tmp_len TSRMLS_CC)) != NULL) { + if ((result = mmc_delete(mmc, key_tmp2, key_tmp_len, 0 TSRMLS_CC)) < 0) { mmc_server_failure(mmc TSRMLS_CC); } }