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

时间:2009-11-06 03:17:35

标签: php arrays data-structures shared-memory

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

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

4 个答案:

答案 0 :(得分:6)

这是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_get时,PHP都必须反序列化整个值,这在50MB阵列上真的很慢。

如何将其分解为单个值?

另外,您可能需要考虑使用APC的变量缓存,它将为您处理所有共享内存和锁定(并且还将使用哈希表进行密钥查找)

答案 1 :(得分:2)

形成文档的措辞

  

shm_get_var()返回变量   使用给定的variable_key,在   给定共享内存段。该   变量仍然存在于   共享内存。

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

答案 2 :(得分:2)

我不是这方面的专家,但是可以为这样的东西编写快速测试吗?

$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';
}

答案 3 :(得分:1)

你可以使用shm_remove() 看看这个:http://php.net/manual/en/function.shm-remove.php