Подтвердить что ты не робот

PHP APC в режиме CLI

Поддерживает ли модуль APC в PHP при работе в режиме CLI оптимизацию кода? Например, когда я запускаю файл с php -f <file>, файл будет оптимизирован с помощью APC перед выполнением или нет? Предполагая, что APC настроена на загрузку в файле конфигурации. Кроме того, оптимизируются ли скрипты, включенные в require_once?

Я знаю, что оптимизация работает нормально при работе в режиме fastcgi, но мне интересно, работает ли она в CLI.

apc_ * работают, но мне интересно, как оптимизировать код, и это главное, что я здесь делаю.

Счастливый день, Matic

4b9b3361

Ответ 1

Документация apc.enable_cli, которая определяет, следует ли активировать APC в режиме CLI, говорит (цитирует):

В основном для тестирования и отладки. Установка этого параметра позволяет APC для CLI версии PHP. При нормальном обстоятельства, он не идеален для создавать, заполнять и уничтожать APC кеша при каждом запросе CLI, но для различные тестовые сценарии полезно иметь возможность включить APC для CLI версии PHP легко.

Возможно, APC сохранит коды операций в памяти, но по мере того, как исполняемый файл PHP умрет в конце script, эта память будет потеряна: она не будет сохраняться между выполнением script.

Итак, кеш-код opcode в APC бесполезен в режиме CLI: он ничего не будет оптимизировать, поскольку PHP все равно придется перекомпилировать исходный код для кодов операций при каждом запуске исполняемого файла PHP.


На самом деле, APC не "оптимизирует": стандартный способ выполнения PHP script выглядит следующим образом:

  • прочитайте файл и скомпилируйте его в opcodes
  • выполнить коды операций

То, что APC делает, хранится в кодах операций в памяти, поэтому выполнение PHP script становится:

  • читайте коды операций из памяти (намного быстрее, чем компиляция исходного кода)
  • выполнить коды операций

Но это означает, что у вас должно быть место в памяти для хранения кодов операций. При запуске PHP в качестве модуля Apache Apache отвечает за сохранение этого сегмента памяти... Когда PHP запускается из CLI, нет ничего, что бы сохранить сегмент памяти, поэтому он будет уничтожен в конце выполнения PHP.
(Я не знаю, как это работает точно, но это что-то вроде этого, по крайней мере в принципах, даже если мои слова не очень "технические" ^^)


Или, под "оптимизацией" вы подразумеваете нечто иное, чем кеш-код операции, например, директиву конфигурации apc.optimization? Если это так, то этот был удален в APC 3.0.13

Ответ 2

Ну, есть хорошая причина для APC в режиме CLI: UnitTesting: Я хочу сделать свой unit test с помощью среды, максимально приближенной к более поздней производственной среде. Zend Framework имеет внутреннее решение для кэширования, которое может использовать переменный кэш APC в качестве хранилища данных - и я хочу использовать это.

Ответ 3

Если у вас есть код CLI, который генерирует любую конфигурацию на основе среды, тогда код CLI будет считать, что APC не включен. Например, при создании контейнера Symfony DI через CLI он покажет, что Doctrine не будет использовать APC (подробности).

Кроме того, я не тестировал его, но есть шанс, что APC может улучшить скорость скриптов для файлов, включенных после pcntl_fork(). Изменить: я задал вопрос о APC и pcntl_fork() здесь.

Для полноты, чтобы включить APC в CLI (в Ubuntu):

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini