PHP扩展开发中zend_hash_find函数同一个KEY取到不同的指针值?

发布于 2022-09-04 08:25:48 字数 1933 浏览 24 评论 0

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值指针出现的概率越小。为什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文