如果我运行 shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗?
我想在共享内存中保留一个大小约为 50MB 的数组,以便多个进程可以使用它,而不必保留这个 50MB 数组的多个副本。如果共享内存不是答案,还有人有其他想法吗?
如果我运行 shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗?
我想在共享内存中保留一个大小约为 50MB 的数组,以便多个进程可以使用它,而不必保留这个 50MB 数组的多个副本。如果共享内存不是答案,还有人有其他想法吗?
这是 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 的变量缓存,它将为您处理所有共享内存和锁定(并且还将使用哈希表进行键查找)
我不是这方面的专家,但是否可以为此编写一个快速测试,如下所示?
$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';
}
形成文件的措辞
shm_get_var() 在给定的共享内存段中返回具有给定 variable_key 的变量。该变量仍然存在于共享内存中。
我会说是的,它是对共享内存空间的引用。
你可以使用 shm_remove() 看看这个:http ://php.net/manual/en/function.shm-remove.php