当前位置 : 主页 > 网络推广 > seo >

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

来源:互联网 收集:自由互联 发布时间:2021-06-16
如果我运行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的变量缓存,它将为您处理所有共享内存和锁定(并且还将使用哈希表进行密钥查找)

网友评论