天天看點

shm_get_var傳回拷貝還是引用?

本文目的

本文探讨了php标準擴充sysvshm庫中的函數shm_get_var傳回變量的copy還是reference。

問題背景

php标準擴充中的sysvshm提供了php通路共享記憶體的能力,而且資料的最小粒度是變量,這樣可以免去手動變量序列化和反序列化,比另一個标準擴充shmop好使用。但是,如果假設有一個50M的數組放到共享記憶體中,反複的通路此變量,是否會影響系統性能?如果shm_get_var傳回的是變量引用,那麼性能開銷不大,因為每次傳回的都隻是記憶體的“指針”,不會拷貝真實資料。如果傳回的是copy呢?那麼每通路一次,就需要拷貝50M左右的記憶體,如果通路頻率過大,那麼就會導緻性能瓶頸。

驗證

到底傳回什麼,通過下面的代碼,可以得到驗證:

執行結果如下:

<a href="http://images.cnblogs.com/cnblogs_com/bourneli/201208/201208051603257424.jpg"></a>

是以,很明顯,傳回的是copy而不是reference。

原始代碼

為什麼會傳回copy呢?可以看看shm_get_var的c代碼實,檔案位置PHP_SRC/ext/sysvshm/sysvshm.c,如下:

從上面的代碼,可以知道shm_get_var的内部實作會調用php_var_unserialize進行反序列化,也就表示變量其實還是以序列化後的位元組流形式存放在共享記憶體中,這樣必然無法傳回變量引用,隻能傳回拷貝。shm_get_var隻是為我們做了反序列化工作,本質上與shmop_read一樣。

結論

由于php_get_var傳回的是變量拷貝,如果需要反複通路共享記憶體中的較大的變量時,最好換一種存儲政策,因為共享記憶體會重複拷貝資料,造成不必要的性能開銷。

參考資料

<a href="http://stackoverflow.com/questions/1685196/does-php-copy-variables-when-retrieving-from-shared-memory">stackOverflow: Does PHP copy variables when retrieving from shared memory?</a>

本文轉自bourneli部落格園部落格,原文連結:http://www.cnblogs.com/bourneli/archive/2012/08/05/2623939.html,如需轉載請自行聯系原作者