c - PHP扩展开发中zend_hash_find函数同一个KEY取到不同的指针值?
高洛峰
高洛峰 2017-04-11 08:59:11
0
0
374

PHP扩展开发使用了PHP内核内置的hashtable操作API。通过zend_hash_update或zend_hash_add设置的值,在通过zend_hash_find取得的值的指针会不尽相同,并且有时会取到空值。

主要代码如下:(代码有剪切)

static HashTable *sptable = NULL;

const zend_function_entry spool_functions[] = {
    PHP_FE(spool_set, NULL)
    PHP_FE(spool_get, NULL)
    PHP_FE_END
};

PHP_MINIT_FUNCTION(spool)
{
    sptable = pemalloc(sizeof(HashTable), 1);
    zend_hash_init( sptable, 100, NULL, NULL, 1);
    return SUCCESS;
}

PHP_MSHUTDOWN_FUNCTION(spool)
{
    if(sptable) {
        zend_hash_destroy( sptable);
        pefree( sptable, 1);
        sptable = NULL;
    }
    return SUCCESS;
}
PHP_FUNCTION(spool_set)
{
    char *key = "longmon";
    uint valen = sizeof(int);
    uint keylen = strlen(key);
    int val = 100;
    php_printf("spool poniter:%u\n", sptable);
    if( zend_hash_exists(sptable, key, keylen) == FAILURE ) {
        zend_hash_add(sptable, key, keylen, (void*)&val, valen, NULL);
    }else{
        zend_hash_update(sptable, key, keylen, (void*)&val, valen, NULL);
    }
    php_printf("Hash elements add");
    return;
}
PHP_FUNCTION(spool_get)
{
    char *key = "longmon";
    uint  keylen = strlen(key);
    int *data = 0;
    zend_hash_find( sptable, key, keylen, (void *)&data );
    if( data ){
                php_printf("value pointer:%u, value:%d\n", data, (int)*data);
        } else{
                php_printf("value pointer:%u\n", data);
        }

    return;
}

PHP调用脚本:(php-fpm模式)

//先执行spool_set函数再执行spool_get函数
var_dump(spool_set()); 

var_dump(spool_get());

在我的计算机上spool_get输出三种结果:

value pointer:39272192, value:100 (结果1)
value pointer:39272608, value:100 (结果2)
value pointer:0 (结果3)

问题:
1,函数打印的指针值会有变化但取到的值是相同的(结果1与结果2)。同样的KEY应该取的同一个索引位置吧?它的指针值应该也是相同的吧!?
2,有一定机率取出来的指针是0值(结果3)。这个机率与spool_set执行次数多少有关。如果spool_set执行次数越多,0值指针出现的概率越小。为什么?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!