如果我运行shm_get_var(),它会返回一个“引用”,将数据保存在共享内存中吗? 我想在共享内存中保留一个大小约50MB的数组,这样它就可以被多个进程使用,而不必保留这个50MB数组的多个副
我想在共享内存中保留一个大小约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的变量缓存,它将为您处理所有共享内存和锁定(并且还将使用哈希表进行密钥查找)