PHP在从共享内存检索时是否复制变量?

PHP在从共享内存检索时是否复制变量?,php,arrays,data-structures,shared-memory,Php,Arrays,Data Structures,Shared Memory,如果我运行一个shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗 我想在共享内存中保留一个大约50MB大小的数组,这样它就可以被多个进程使用,而不必保留这个50MB数组的多个副本。如果共享内存不是答案,有人有其他想法吗?形成文档的措辞 shm_get_var()返回变量 使用给定的变量_键,在 给定共享内存段。这个 变量仍然存在于 共享内存 我会说是的,这是对共享内存空间的引用 您可以使用shm_remove() 看看这个:我不是这方面的专家,但是有可能为此编写一个类似以

如果我运行一个shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗


我想在共享内存中保留一个大约50MB大小的数组,这样它就可以被多个进程使用,而不必保留这个50MB数组的多个副本。如果共享内存不是答案,有人有其他想法吗?

形成文档的措辞

shm_get_var()返回变量 使用给定的变量_键,在 给定共享内存段。这个 变量仍然存在于 共享内存

我会说是的,这是对共享内存空间的引用

您可以使用shm_remove()
看看这个:

我不是这方面的专家,但是有可能为此编写一个类似以下内容的快速测试吗

$key = 1234;
//put something small into shared memory
$identifier = shm_attach($key, 1024, 0777);
shm_put_var($identifier, $key, 'shave and a hair cut');

$firstVar = shm_get_var($identifier, $key);
$firstVar .= 'Test String of Doom';
$secondVar = shm_get_var($identifier, $key);

if ($firstVar == $secondVar) {
    echo 'shm_get_var passes by reference';
} else {
    echo 'shm_get_var passes by value';
}

这是PHP 5.2.9中sysvsem.C的相关C代码片段:

/* setup string-variable and serialize */
/* get serialized variable from shared memory */
shm_varpos = php_check_shm_data((shm_list_ptr->ptr), key);

if (shm_varpos < 0) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable key %ld doesn't exist", key);
    RETURN_FALSE;
}
shm_var = (sysvshm_chunk*) ((char *)shm_list_ptr->ptr + shm_varpos);
shm_data = &shm_var->mem;

PHP_VAR_UNSERIALIZE_INIT(var_hash);
if (php_var_unserialize(&return_value, (const unsigned char **) &shm_data, shm_data + shm_var->length, &var_hash TSRMLS_CC) != 1) {
    PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "variable data in shared memory is corrupted");
    RETURN_FALSE;
}
PHP_VAR_UNSERIALIZE_DESTROY(var_hash);
/*设置字符串变量并序列化*/
/*从共享内存获取序列化变量*/
shm_varpos=php_check_shm_data((shm_list_ptr->ptr),键);
如果(shm_varpos<0){
php_错误_docref(NULL TSRMLS_CC,E_警告,“变量键%ld不存在”,键);
返回错误;
}
shm_var=(sysvshm_chunk*)((char*)shm_list_ptr->ptr+shm_varpos);
shm_data=&shm_var->mem;
PHP_VAR_UNSERIALIZE_INIT(VAR_hash);
if(php_var_unserialize(&return_value,(const unsigned char**)&shm_数据,shm_数据+shm_var->length,&var_hash TSRMLS\u CC)!=1){
PHP_VAR_UNSERIALIZE_DESTROY(VAR_hash);
php_error_docref(NULL TSRMLS_CC,E_警告,“共享内存中的变量数据已损坏”);
返回错误;
}
PHP_VAR_UNSERIALIZE_DESTROY(VAR_hash);
每次调用shm_get时,PHP都必须取消序列化整个值,在50MB数组中,这将非常缓慢

把它分解成不同的价值观怎么样


也可以考虑使用APC的变量缓存,它将处理所有的共享内存和锁(也将使用哈希表进行关键字查找)

。结果是什么?所以,在我修正了键必须是长键的事实后(编辑答案以使用长值),它打印了“shm_get_var passs by value”。