2009-11-06 50 views
4

如果我運行一個shm_get_var(),它會返回一個「引用」,將數據保存在共享內存中嗎?當從共享內存中檢索時,PHP複製變量嗎?

我想在共享內存中保留一個大小約爲50MB的數組,以便多個進程可以使用它,而不必將此50MB陣列的多個副本掛起。如果共享內存不是答案,有沒有人有另一個想法?

回答

6

這是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的變量緩存,這將處理所有的共享內存和鎖定你(和也將使用哈希表的鍵查找)

+0

哇岩石^^ snipet的PHP源代碼... – RageZ 2009-11-06 04:19:46

2

形式的文檔的措辭

shm_get_var()返回變量 與給定variable_key,在給定的 共享存儲器段。 變量仍存在於 共享內存中。

我會說是的這是對共享內存空間的引用。

+0

的措詞聽起來模棱兩可給我。 – Akrikos 2009-11-06 03:55:21

2

我沒有這方面的專家,但有可能寫這個東西像下面這樣的快速測試?

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

古玩...結果如何? – realtebo 2013-05-29 10:14:02

+1

因此,在我確定該鍵需要是Long(編輯答案以使用long值)的事實後,它會打印'shm_get_var按值傳遞'。 – Akrikos 2013-06-05 19:17:52

+0

感謝您的回覆! – realtebo 2013-06-06 07:25:06