2013-06-13 2 views
0

Я пытаюсь понять настройку apc.shm_strings_buffer в apc.ini. После перезагрузки PHP круговая диаграмма в администраторе APC показывает, что 8 МБ кэша уже используется, хотя нет кэшированных записей (за исключением apc.php, конечно). Я нашел, что это относится к настройке apc.shm_strings_buffer.Что такое настройка apc.shm_strings_buffer для APC для PHP?

Может кто-нибудь помочь мне понять, что означает настройка? В файле конфигурации отмечается, что это «объем разделяемой памяти, зарезервированный для строк, с суффиксом M/G», но я не понимаю.

Я использую APC с PHP-FPM.

ответ

2

Простая часть для объяснения - «с суффиксом M/G», что означает, что если вы установите ее на 8M, тогда будет выделено 8 мегабайт, или 1G выделит 1 гигабайт памяти.

Более сложный бит для объяснения состоит в том, что это кеш для хранения строк, которые используются внутри APC при компиляции и кэшировании кода операции.

Значение конфигурации было введено in this change, и основная часть изменения заключалась в том, чтобы добавить apc_string.c в проект APC. Основная функция, определенная в этом файле C, - apc_new_interned_string, которая затем используется в apc_string_pmemcpy в apc_compile.c. остальной модуль 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 с PHP-FPM, я на 90% уверен, что кеш сохраненных строк распределяется между всеми рабочими в одном пуле, но я все еще проверяю это.

Весь размер, выделенный для хранения общих строк, выделяется при запуске PHP - он не распределяется динамически. Поэтому следует ожидать, что APC отобразит 8MB, используемый для кеша строк, хотя вряд ли какие-либо строки уже кэшированы.

Редактировать

Хотя это отвечает, что он делает, я понятия не имею, как видеть, сколько из общего буфера строки используются, так что нет никакого способа узнать, что это должно быть установлено ,

+0

Ваш ответ, конечно, немного проясняет ситуацию, хотя концепция встроенного в тайник строк по-прежнему поражает мой разум (поэтому мне потребовалось некоторое время для комментариев). Для изменения, которое было введено три года назад, в нем имеется очень мало информации, поэтому, как вы сказали, я действительно не знаю, как его установить (я полагаю, что я просто придерживаюсь 8M по умолчанию?) , – redburn

+0

Уверен, почему бы и нет :) Кстати, я только узнал, что кеш apc не рекомендуется, поскольку он не находится в активной разработке и заменяется ZendOptimizer, который был переименован в OPCache, так что пока все, работающие сейчас, я просто уйду Это. btw У OPCache есть приличная документация https://github.com/zendtech/ZendOptimizerPlus/blob/master/README – Danack

+0

Это хорошо, спасибо.Не уверен, как я к этому отношусь, поскольку APC работает довольно хорошо, и у OPCache, по-видимому, не будет кеша пользователя. В любом случае, спасибо за вашу помощь, я думаю, что ваш ответ очищает все, насколько это возможно, поэтому я сейчас отмечаю это как таковое. – redburn

Смежные вопросы