Настройка во время выполнения
Поведение этих функций зависит от установок в php.ini.
Несмотря на то, что настройки APC по умолчанию подходят для большинства установок, для некоторых задач может потребоваться более тонкая настройка.
При конфигурировании APC есть два главных момента, на которые необходимо обратить внимание. Первый - сколько памяти предоставить в распоряжение APC, а второй - будет ли APC проверять, модифицировался ли файл, при каждом запросе. За эти настройки отвечают параметры apc.shm_size и apc.stat, соответственно. Крайне внимательно прочитайте разделы, относящиеся к настройке этих параметров.
Как только сервер запущен, скрипт apc.php, поставляемый с этим расширением, должен быть скопирован в "docroot" и права на него должны позволять запустить его через браузер. Этот скрипт предоставляет детальную информацию по работе APC. Если в PHP разрешен GD, то этот скрипт также будет показывать полезные графики. Конечно же первое, что будет интересно, это то, кеширует ли APC что нибудь. Если APC работает, то значение Cache full count (слева) будет показывать, сколько раз кеш полностью заполнится и был вынужден принудительно удалить записи, к которым не обращались последние apc.ttl секунд. Чем меньше это число - тем лучше сконфигурирован кеш. Если это число постоянно растет, значит APC приходится постоянно очищать старые записи и значит теряется весь смысл кеширования. Самый лучший способ уменьшить это число - это добавить памяти для APC. Если сделать этого нельзя, то надо перенастроить apc.filters, чтобы ограничить набор кешируемых скриптов.
Если APC собран с поддержкой mmap (Memory Mapping), он будет использовать всего один сегмент памяти, если же наоборот, APC собран с поддержкой SHM (SysV Shared Memory), он будет использовать несколько сегментов. MMAP не имеет максимального ограничения, в отличие от SHM, который ограничивается /proc/sys/kernel/shmmax. Обычно рекомендуется использовать MMAP, потому что он гораздо быстрее выделяет память при перезагрузке веб-сервера, что сказывается на скорости запуска сервера.
| Имя | По умолчанию | Место изменения | Список изменений |
|---|---|---|---|
| apc.enabled | "1" | PHP_INI_SYSTEM | PHP_INI_SYSTEM в APC 2. PHP_INI_ALL в APC <= 3.0.12. |
| apc.shm_segments | "1" | PHP_INI_SYSTEM | |
| apc.shm_size | "32M" | PHP_INI_SYSTEM | |
| apc.shm_strings_buffer | "4M" | PHP_INI_SYSTEM | Доступно с APC 3.1.4. |
| apc.optimization | "0" | PHP_INI_ALL | PHP_INI_SYSTEM в APC 2. Удалено в APC 3.0.13. |
| apc.num_files_hint | "1000" | PHP_INI_SYSTEM | |
| apc.user_entries_hint | "4096" | PHP_INI_SYSTEM | Доступно с APC 3.0.0. |
| apc.ttl | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.0. |
| apc.user_ttl | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.0. |
| apc.gc_ttl | "3600" | PHP_INI_SYSTEM | |
| apc.cache_by_default | "1" | PHP_INI_ALL | PHP_INI_SYSTEM в APC <= 3.0.12. Доступно с APC 3.0.0. |
| apc.filters | NULL | PHP_INI_SYSTEM | |
| apc.mmap_file_mask | NULL | PHP_INI_SYSTEM | |
| apc.slam_defense | "1" | PHP_INI_SYSTEM | Доступно с APC 3.0.0. До APC 3.1.4, значение по умолчанию "0" (disabled). |
| apc.file_update_protection | "2" | PHP_INI_SYSTEM | Доступно с APC 3.0.6. |
| apc.enable_cli | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.7. |
| apc.max_file_size | "1M" | PHP_INI_SYSTEM | Доступно с APC 3.0.7. |
| apc.use_request_time | "1" | PHP_INI_ALL | Доступно с APC 3.1.3. |
| apc.stat | "1" | PHP_INI_SYSTEM | Доступно с APC 3.0.10. |
| apc.write_lock | "1" | PHP_INI_SYSTEM | Доступно с APC 3.0.11. |
| apc.report_autofilter | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.11. |
| apc.serializer | "default" | PHP_INI_SYSTEM | Доступно с APC 3.1.0. |
| apc.include_once_override | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.12. |
| apc.rfc1867 | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.13. |
| apc.rfc1867_prefix | "upload_" | PHP_INI_SYSTEM | |
| apc.rfc1867_name | "APC_UPLOAD_PROGRESS" | PHP_INI_SYSTEM | |
| apc.rfc1867_freq | "0" | PHP_INI_SYSTEM | |
| apc.rfc1867_ttl | "3600" | PHP_INI_SYSTEM | Доступно с APC 3.1.1. |
| apc.localcache | "0" | PHP_INI_SYSTEM | Доступно в APC 3.0.14 - 3.1.11. |
| apc.localcache.size | "512" | PHP_INI_SYSTEM | Доступно в APC 3.0.14 - 3.1.11. |
| apc.coredump_unmap | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.16. |
| apc.stat_ctime | "0" | PHP_INI_SYSTEM | Доступно с APC 3.0.13. |
| apc.preload_path | NULL | PHP_INI_SYSTEM | Доступно с APC 3.1.1. |
| apc.file_md5 | "0" | PHP_INI_SYSTEM | Доступно с APC 3.1.1. |
| apc.canonicalize | "1" | PHP_INI_SYSTEM | Доступно с APC 3.1.1. |
| apc.lazy_functions | 0 | PHP_INI_SYSTEM | Доступно с APC 3.1.3. |
| apc.lazy_classes | 0 | PHP_INI_SYSTEM | Доступно с APC 3.1.3. |
Краткое разъяснение конфигурационных директив.
-
apc.enabledboolean -
Если установить apc.enabled равным 0, то APC не будет включен. Это полезно, когда APC статически включен в PHP и нет других вариантов, для запрета его использования. Если APC собран как DSO, можно просто закомментировать строку extension в php.ini.
-
apc.shm_segmentsinteger -
Количество сегментов разделяемой памяти выделенной под кеш. Если APC использовал всю доступную разделяемую память, а apc.shm_size таким большим, как позволяет система, увеличение этого параметра может помочь.
-
apc.shm_sizestring -
Размер сегмента разделяемой памяти, заданный в короткой нотации (см. этот FAQ). По умолчанию некоторые системы (включая большинство вариантов BSD) ограничивают это значение крайне малым значением.
-
apc.shm_strings_bufferstring -
Размер памяти отданный под разделяемый строковый кеш, используемый внутренними процессами APC. Размер должен завершаться суффиксом M или G для обозначения мегабайт и гигабайт, соответственно. Использование этого параметра может сократить размер памяти рабочих процессов PHP-FPM, так как одинаковые строки будут сохранены в памяти всего один раз и смогут использоваться всеми рабочими процессами.
-
apc.optimizationinteger -
Уровень оптимизации. Ноль запрещает оптимизаци. Чем выше это значение, тем более аггресивная оптимизация будет использована. Не ждите большого прироста в скорости. Это эксперементальная функциональность.
-
apc.num_files_hintinteger -
Подсказка по количеству уникальных файлов, использующихся в вашем сайте. Установите равным нулю или вообще не указывайте, если не уверены. Эта настройка полезна, когда у вас много тысяч файлов.
-
apc.user_entries_hintinteger -
Как и apc.num_files_hint, это подсказка о количестве уникальных пользовательских переменных, которые надо кешировать. Установите равным нулю или вообще не указывайте, если не уверены.
-
apc.ttlinteger -
Количество секунд, в течение которых запись может находиться в кеше без обращения к ней, прежде чем будт разрешено ее заменить на другую. Установка этого параметра, равного нулю может привести к тому, что все место будет забито и новые записи не смогут попасть в кеш. В этом случае, если параметр равен 0, кеш будет полностью очищен. Если же ttl будет больше нуля, то APC постарается очистить устаревшие записи.
-
apc.user_ttlinteger -
Количество секунд, в течение которых запись может находиться в кеше без обращения к ней, прежде чем будт разрешено ее заменить на другую. Установка этого параметра равного нулю может привести к тому, что все место будет забито и новые записи не смогут попасть в кеш. В этом случае, если параметр равен 0, кеш будет полностью очищен. Если же ttl будет больше нуля, то APC постарается очистить устаревшие записи.
-
apc.gc_ttlinteger -
Количество секунд, в течение которых запись может находиться в списке сборщика мусора. Это значение обеспечивает безотказность в случае падения сервера в момент исполнения закешированного файла. Если исполняемый файл был изменен, память, выделенная под кеширование его старой версии, не будет возвращена до истечения этого времени. Установка в ноль отключает этот функционал.
-
apc.cache_by_defaultboolean -
По умолчанию включено, но можно отключить и использовать совместно с включенным apc.filters для кеширования только тех файлов, которые заданы фильтрами.
-
apc.filtersstring -
Список регулярных выражений вида расширенных POSIX, перечисленных через запятую. Если имя какого-либо файла совпадет с одним из этих шаблонов, то он не будет кеширован. Обратите внимание, что имена для сравнения берутся ровно так, как они заданы в include/require, а не по абсолютному пути. Если первый символ шаблона это +, то любой совпавший файл будет закеширован, если -, то не будет. По умолчанию всегда подразумевается -.
-
apc.mmap_file_maskstring -
Если собран с поддержкой MMAP, с помощью опции --enable-mmap, этот параметр должен содержать файловую маску типа mktemp-style для передачи в расширение MMAP, чтобы определить, будет ли MMAP использовать файловую систему или разделяемую память. Для файловой системы задайте опцию как /tmp/apc.XXXXXX (ровно 6 X). Для использования shm_open/mmap в стиле POSIX, добавьте .shm в любом месте маски, например /apc.shm.XXXXXX Вы также можете установить его как /dev/zero для использования интерфейса ядра /dev/zero для анонимной памяти mmap. Если не задано, то будет принудительно использоваться анонимный mmap.
-
apc.slam_defenseinteger -
На очень загруженных серверах, когда вы запускаете веб-сервер, сразу множество процессов будут пытаться закешировать один и тот же файл одновременно. Этой опцией задается вероятность, в процентах, того, что попытка одного конкретного процесса закешировать данные будет отклонена. Например если apc.slam_defense установить равной 75, то это означает, что вероятность закешировать файл, которого в кеше нет, будет равна 25% и вероятность того, что в кешировании будет отказано равна 75%. Для запрета данного функционала установите этот параметр равным 0.
Deprecated by apc.write_lock.
-
apc.file_update_protectioninteger -
Когда файл изменяется на ходу, это должно происходить атомарным образом. То есть сначала его надо записать во временный файл, а затем переместить (mv) на его целевую позицию. Многие текстовые редакторы, cp, tar и прочие не делают этого. Это может привести к тому, что файл будет запрошен (и закеширован) в момент его записи. Настройка apc.file_update_protection задает задержку кеширования для совершенно новых файлов. По умолчанию 2 секунды. Это означает, что если временная метка модификации файла (mtime) говорит, что с если момента изменения файла прошло менее 2 секунд, он не будет кеширован. Несчастный человек, который попытается обратиться в полусохраненному файлу будет наблюдать странное поведение, но, по крайней мере, оно продлится не долго. Если все файлы веб-сервера будут обновляться атомарно, с помощью таких методов как rsync (который производит обновление корректно), то это поведение можно отключить установим этот параметр равным нулю. Если система перегружена по вводу/выводу, то некоторые обновления могут длиться больше двух секунд и эта настройка должна быть соответственно увеличина.
-
apc.enable_cliinteger -
Больше для тестирования и отладки. Эта настройка разрешает APC для CLI-версии PHP. При обычной работе запускать APC, который будет создавать, наполнять и уничтожать кеш при каждом запуске сценария в консоли, будет далеко не лучшей идеей. Но в целях тестирования и отладки, можно легко включить APC для CLI.
-
apc.max_file_sizeinteger -
Не кеширует файлы большего, чем задано этой настройкой, размера. По умолчанию 1M.
-
apc.statinteger -
Будьте осторожны меняя эту настройку. По умолчанию она включена, заставляя APC проверять файлы скриптов при каждом запросе на предмет не были ли они изменены. Если они были изменены, то они будут перекомпилированы и закешированы заново. Если же эту настройку отключить, то APC такую проверку производить не будет и если файл уже был закеширован, а после этого изменен, то новая версия в кеш не попадет. Для перекеширования потребуется перезагрузить веб-сервер. Обратите внимание, что веб-сервера, сконфигурированные для использования FastCGI могут не очищать кеш при перезапуске. В промышленных средах, где изменения файлов происходят крайне редко, отключение этой опции может значительно повысить производительность.
Для файлов загружаемых через included/required это опция работает замечательно, но имейте в виду, что при включении файла по относительному пути (в Unix это любой путь, не начинающийся с /), APC будет проверять его на уникальность. Если же используются абсолютные пути, APC будет пропускать эту проверку и использовать абсолютный путь как уникальный идентификатор файла.
-
apc.write_lockboolean -
На высоконагруженных серверах, когда сервер стартует, или когда множество файлов изменяются одновременно, APC может попытаться скомпилировать и закешировать один и тот же файл несколько раз одновременно. Блокировка записи гарантирует, что только один процесс будет пытаться компилировать и кешировать некешированный файл. Другие процессы, которым нужно использовать этот файл, будут использовать его некешированную версию, вместо того, чтобы ждать его появления в кеше.
-
apc.report_autofilterboolean -
Логирует любые скрипты, которые были исключены из кеширования из-за проблем раннего или позднего связывания.
-
apc.serializerstring -
Указывает APC использовать сторонний сериализатор.
-
apc.include_once_overrideboolean -
Оптимизирует вызовы include_once и require_once для предотвращения дорогих системных вызовов.
ВниманиеЭтот функционал является ЭКСПЕРЕМЕНТАЛЬНЫМ. Поведение этой директивы, ее имя и документация на нее могут измениться без предупреждения в будущих версиях APC. Используйте ее на свой страх и риск.
-
apc.rfc1867boolean -
Перехватчик прогресса загрузки файлов RFC1867 доступен в APC только если он собран с PHP 5.2.0 и выше. Если разрешено, то любой загружаемый на сервер файл, содержащий в форме, перед полем с файлом, поле с именем APC_UPLOAD_PROGRESS, будет вынуждать APC автоматически создавать пользовательскую запись в кеше вида upload_key, где key - это значение поля APC_UPLOAD_PROGRESS.
Помните, что скрытое поле APC_UPLOAD_PROGRESS должно идти до поля с файлом, иначе работа будет некорректной.
Обратите внимание, отслеживание загрузки файла потоконебезопасна, так что если во время первой загрузки случится новая, с тем же ключем, отслеживание первой будет прекращено.
Обратите внимание, что rate будет доступен только когда все текущие загрузки завершены.
Пример #1 Пример использования apc.rfc1867
<?php
print_r(apc_fetch("upload_$_POST[APC_UPLOAD_PROGRESS]"));
?>Результатом выполнения данного примера будет что-то подобное:
Array ( [total] => 1142543 [current] => 1142543 [rate] => 1828068.8 [filename] => test [name] => file [temp_filename] => /tmp/php8F [cancel_upload] => 0 [done] => 1 ) -
apc.rfc1867_prefixstring -
Префикс ключа для использования в записи кеша пользователя, создаваемой функционалом отслеживания прогресса загрузки rfc1867.
-
apc.rfc1867_namestring -
Задает имя для скрытого поля формы, которое будет активировать процесс загрузки APC и указывать суффикс ключа пользовательского кеша.
-
apc.rfc1867_freqstring -
Частота, с которой будет обновляться пользовательская запись в кеше во время загрузки файла. Может задаваться как в процентах, так и указанием размера в байтах. При желании можно использовать суффиксы "k", "m" и "g" (регистронезависимо) для килобайт, мегабайт и гигабайт, соответственно. Если указать ноль, то обновления будут происходить так быстро, как только возможно, но это может замедлить загрузку.
-
apc.rfc1867_ttlinteger -
TTL для записей rfc1867.
-
apc.localcacheboolean -
Разрешает неблокирующий локальный теневой кеш процессов, что уменьшает количество блокировок во время записи кеша.
-
apc.localcache.sizeinteger -
Размер локального теневого кеша процессов, должен быть достаточно большим, примерно в половину apc.num_files_hint.
-
apc.coredump_unmapboolean -
Разрешает APC перехватывать сигналы, такие как SIGSEGV, который записывает coredump, когда подан. Когда эти сигналы будут получены, APC попытается освободить всю разделяемую память, чтобы не включать ее в coredump. Эта настройка может увеличить стабильность системы, когда критический сигнал был получен, а APC сконфигурирован на использование большого объема памяти.
ВниманиеЭта возможность потенциально опасна. Освобождение сегментов разделяемой памяти при получении критического сигнала может привести к непредсказуемому поведению.
Замечание:
Хотя некоторые ядра предоставляют возможность игнорировать некоторые сегменты разделяемой памяти при записи core-файла, эти реализации могут также игнорировать важные сегменты памяти, такие как Apache scoreboard.
-
apc.stat_ctimeinteger -
Проверка по ctime для избежания проблем, порожденных такими программами как svn или rsync, убедившись, что inode не поменялся с момента последнего сбора статистики. Обычно APC проверяет только mtime.
-
apc.canonicalizebool -
Если запрещено, то относительные пути приводятся к каноничным в режиме no-stat. Если разрешено, то файлы, подключенные через потоковую обертку не будут кешироваться, так как realpath() не поддерживает потоковые обертки.
-
apc.preload_pathstring -
Опционально. Задает путь, который используется APC для загрузки кешированных данных во время запуска.
-
apc.use_request_timebool -
Использовать время старта запроса SAPI для TTL.
-
apc.file_md5bool -
Записывать хеши md5 файлов.
-
apc.lazy_functionsinteger -
Разрешает ленивую подгрузку функций.
-
apc.lazy_classesinteger -
Разрешает ленивую подгрузку классов.