PHP memcache addserver的使用(failover)

 
转自:http://www.codytan.com/?p=739

 

memcache源码分析-addserver、failover机制

首先从addserver开始,addserver会先去hashtable里面查找是否已经存在连接池了,如果没有则创建之:

/* memcache.c:2070*/ /* initialize pool if need be */ if (zend_hash_find (Z_OBJPROP_P (mmc_object ) , "connection" , sizeof ( "connection" ) , ( void ** ) &amp ;connection ) == FAILURE ) {pool = mmc_pool_new (TSRMLS_C ) ;list_id = zend_list_insert (pool , le_memcache_pool ) ;add_property_resource (mmc_object , "connection" , list_id ) ; } else {pool = (mmc_pool_t * ) zend_list_find (Z_LVAL_PP (connection ) , &amp ;resource_type ) ; if ( !pool || resource_type != le_memcache_pool ) {php_error_docref (NULL TSRMLS_CC , E_WARNING , "Failed to extract 'connection' variable from object" ) ;RETURN_FALSE ; } } mmc_pool_add (pool , mmc , weight ) ;

并且往连接池内记录这个连接;

/* add server and a preallocated request pointer */if (pool->num_servers) {pool->servers = erealloc(pool->servers, sizeof(mmc_t *) * (pool->num_servers + 1));pool->requests = erealloc(pool->requests, sizeof(mmc_t *) * (pool->num_servers + 1));}else {pool->servers = emalloc(sizeof(mmc_t *));pool->requests = emalloc(sizeof(mmc_t *));} pool->servers[pool->num_servers] = mmc;pool->num_servers++;

 

可以看到addserver的时候并不会去检查这个数据库连接是否正常,连接池写入了如果来failover呢?
我们来看一下set操作的过程:(节选)

if (!mmc_get_pool(mmc_object, &pool TSRMLS_CC) || !pool->num_servers) {RETURN_FALSE;}

 

查看连接池中是否有连接,

while (result < 0 && (mmc = mmc_pool_find(pool, key, key_len TSRMLS_CC)) != NULL) {if ((result = mmc_server_store(mmc, request, request_len TSRMLS_CC)) < 0) {mmc_server_failure(mmc TSRMLS_CC);}}

 

这里就是addserver的作用了,一直找到连接正常的连接,并且发现失败连接的时候通过mmc_server_failure来
标识,起到failover的作用,那些request或者TSRMLS_CC这些宏不明白也没关系,知道php进程的过程是MINT/RINT,RSHUTDOWN/MSHUTDOWN,TSRMLS_CC(TSRM (Thread Safe Resource Management).
)是zend的宏就可以了,这个宏比较复杂,我也没弄懂,以后的文章可能详细的解释一些zend和php的东西。
其他的操作也都可能会触发failover记录的操作,同时在php.ini中可以配置:

1
2
memcache.allow_failover  	"1"  	PHP_INI_ALL  	Available since memcache 2.0.2.
memcache.max_failover_attempts 	"20" 	PHP_INI_ALL 	Available since memcache 2.1.0.

failover和尝试次数等。

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值