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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...