PHP扩展开发中zend_hash_find函数同一个KEY取到不同的指针值?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论