2013-06-13 30 views
0

我想了解apc.ini中的apc.shm_strings_buffer設置。重新啓動PHP後,APC管理中的餅圖顯示已經使用了8MB的緩存,儘管沒有緩存條目(當然除了apc.php)。我發現這與apc.shm_strings_buffer設置有關。什麼是PHP APC緩存的apc.shm_strings_buffer設置?

有人能幫我理解設置的含義嗎?配置文件指出這是「爲字符串保留的共享內存大小,帶有M/G後綴」,但我無法理解。

我正在使用PHP-FPM的APC。

回答

2

容易解釋的部分是「帶M/G後綴」,這意味着如果將其設置爲8M,那麼將分配8兆字節,否則1G將分配1千兆字節的內存。

更難解釋的一點是,它是一個緩存,用於存儲由編譯和緩存操作碼時APC內部使用的字符串。

配置值被引入in this change,大部分更改是將apc_string.c添加到APC項目。在C文件中定義的主要功能是apc_new_interned_string,然後在apc_compile.c的apc_string_pmemcpy中使用。 APC模塊的其餘部分存儲字符串。

例如在apc_compile.c

/* private members are stored inside property_info as a mangled 
* string of the form: 
*  \0<classname>\0<membername>\0 
*/ 
CHECK((dst->name = apc_string_pmemcpy((char *)src->name, src->name_length+1, pool TSRMLS_CC))); 

當APC去存儲字符串,函數apc_new_interned_string看起來,看它是否該字符串已經在弦上做一個哈希保存在內存中,如果它已經存儲在內存中,它返回存儲的字符串的前一個實例。

只有當該字符串尚未存儲在緩存中時,纔會分配新的內存來存儲該字符串。

如果您使用PHP-FPM運行PHP,我90%確信存儲字符串的緩存是在單個池中的所有工作人員之間共享的,但我仍然仔細檢查了這一點。

分配給存儲共享字符串的整個大小在PHP啓動時分配 - 它不是動態分配的。所以可以預料,APC顯示了用於字符串緩存的8MB,即使幾乎沒有任何字符串實際上已被緩存。

編輯

雖然這個回答它做什麼,我不知道如何,看看有多少的共享字符串緩衝區正在被使用,所以沒有知道什麼應該設爲方式。

+0

雖然內部使用的字符串緩存的概念仍然讓我大跌眼鏡(這就是爲什麼我花了一段時間評論),您的答案肯定會清除一些東西。對於三年前推出的改變,關於它的信息非常少,所以,就像你說的,我真的不知道該怎麼設置(我想我會堅持8M的默認值)? 。 – redburn

+0

當然,爲什麼不:)順便說一句,我剛剛發現,APC緩存是邊緣棄用,因爲它不在積極的發展,並正在被更名爲OPCache的ZendOptimizer取代,所以只要現在工作的東西我只是離開它。順便說一句OPCache確實有體面的文檔https://github.com/zendtech/ZendOptimizerPlus/blob/master/README – Danack

+0

這很好,知道,謝謝。不知道我對此感覺如何,因爲APC工作得很好,OPCache顯然沒有用戶緩存。無論如何,感謝您的幫助,我認爲您的答案儘可能清除了所有問題,所以我現在將它標記爲這樣。 – redburn