PHP扩展:当persistent_list中的值被销毁时?

时间:2016-03-22 12:47:52

标签: php phpredis

我们的分布式数据库有php客户端,它是在php扩展上开发的。 我们将数据库对象存储在persistant_list中。

问题: 从我们发现的日志中,对于相同的进程,有时它无法从persistent_list中找到数据库对象,必须在persistant_list中初始化db对象,但是稍后(可能是1s)它再也找不到相同的键值。似乎持久列表中的值被破坏了。根据我对php的不了解,persistent_list中的值只能被zend_hash_del或web server down掉。源代码:

if (zend_hash_find(&EG(persistent_list), hash_key, hash_key_len+1, (void **) &le) == FAILURE) {
    tc = tair_init();
    last_rst = tair_startup(tc,uri);
    if(last_rst != TAIR_RETURN_SUCCESS){
        return -1;
    }

    zend_rsrc_list_entry new_le;
    new_le.type = le_tair;
    new_le.ptr  = tc;

    /* register new persistent connection */
    if (zend_hash_update(&EG(persistent_list), hash_key, hash_key_len+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL) == FAILURE) {
        tair_deinit(tc);
        tc = NULL;
    } else {
        rsrc_id = zend_list_insert(tc,le_tair);
    }
}else if (le->type != le_tair || le->ptr == NULL) {
    zend_hash_del(&EG(persistent_list), hash_key, hash_key_len+1);

    tc = tair_init();
    last_rst = tair_startup(tc,uri);
    if(last_rst != TAIR_RETURN_SUCCESS){
        return -1;
    }

    zend_rsrc_list_entry new_le;
    new_le.type = le_tair;
    new_le.ptr  = tc;
    if (zend_hash_update(&EG(persistent_list), hash_key, hash_key_len+1, (void *) &new_le, sizeof(zend_rsrc_list_entry), NULL) == FAILURE) {
        tair_deinit(tc);
        tc = NULL;
    } else {
        rsrc_id = zend_list_insert(tc,le_tair);
    }
}else {
    tc = (tair_handler)le->ptr;
    rsrc_id = zend_list_insert(tc,le_tair);
}

PHP_MINIT_FUNCTION(tair)
{
    REGISTER_INI_ENTRIES();
    tair_set_loglevel(tair_globals.log_level);
    le_tair = zend_register_list_destructors_ex(NULL,tair_dtor,"Tair session", module_number);
    return SUCCESS;
}

有谁能告诉我我的php zend引擎有什么问题? Btw客户端使用Nginx + fpm。

0 个答案:

没有答案