如果我運行一個shm_get_var(),它會返回一個「引用」,將數據保存在共享內存中嗎?當從共享內存中檢索時,PHP複製變量嗎?
我想在共享內存中保留一個大小約爲50MB的數組,以便多個進程可以使用它,而不必將此50MB陣列的多個副本掛起。如果共享內存不是答案,有沒有人有另一個想法?
如果我運行一個shm_get_var(),它會返回一個「引用」,將數據保存在共享內存中嗎?當從共享內存中檢索時,PHP複製變量嗎?
我想在共享內存中保留一個大小約爲50MB的數組,以便多個進程可以使用它,而不必將此50MB陣列的多個副本掛起。如果共享內存不是答案,有沒有人有另一個想法?
這是sysvsem.c相關的C代碼片段在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將在每次調用shm_get時間反序列化全部價值,其中,在50MB陣列,將會非常慢。
把它分解成單個值怎麼樣?你
可能還需要考慮使用APC的變量緩存,這將處理所有的共享內存和鎖定你(和也將使用哈希表的鍵查找)
形式的文檔的措辭
shm_get_var()返回變量 與給定variable_key,在給定的 共享存儲器段。 變量仍存在於 共享內存中。
我會說是的這是對共享內存空間的引用。
的措詞聽起來模棱兩可給我。 – Akrikos 2009-11-06 03:55:21
你可以使用shm_remove() 檢查了這一點:http://php.net/manual/en/function.shm-remove.php
我沒有這方面的專家,但有可能寫這個東西像下面這樣的快速測試?
$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';
}
哇岩石^^ snipet的PHP源代碼... – RageZ 2009-11-06 04:19:46