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

发布于 2024-08-09 17:15:55 字数 139 浏览 2 评论 0原文

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

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

If I run an shm_get_var(), will it return a "reference", keeping the data in shared memory?

I'm wanting to keep an array about 50MB in size in shared memory so that it can be used by multiple processes without having to keep multiple copies of this 50MB array hanging around. If shared memory isn't the answer, does anyone have another idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

橘虞初梦 2024-08-16 17:15:55

这是 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 的变量缓存,它将处理所有共享内存并为您锁定(并且还将使用哈希表进行键查找)

This is the relevant C code snippet from sysvsem.c in PHP 5.2.9 :

/* 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);

PHP will have to unserialize the entire value every time you call shm_get, which, on a 50MB array, is going to be really really slow.

How about breaking it up into individual values?

Also you might want to consider using APC's variable cache, which will handle all of the shared memory and locking for you (and will also use a hash table for key lookups)

尬尬 2024-08-16 17:15:55

我不是这方面的专家,但是是否可以为此编写一个快速测试,如下所示?

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

I'm no expert on this, but would it be possible to write a quick test for this something like the following?

$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';
}
(り薆情海 2024-08-16 17:15:55

形成文档的措辞

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

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

form the wording of the documentation

shm_get_var() returns the variable
with a given variable_key , in the
given shared memory segment. The
variable is still present in the
shared memory.

I would say yes it's a reference to the shared memory space.

凉风有信 2024-08-16 17:15:55

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

you can use shm_remove()
Check this out: http://php.net/manual/en/function.shm-remove.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文