PHP APC в режиме CLI

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

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

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

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

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

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

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

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

Фактически, APC не «оптимизирует»: стандартный способ выполнения скрипта PHP выглядит так:

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

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

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

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

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

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

Если у вас есть код CLI, который генерирует любую конфигурацию на основе среды, тогда код CLI будет считать, что APC не включен. Например, при создании контейнера DI Symfony через 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 

Существует еще одна причина использовать его в режиме CLI: некоторые скрипты могут использовать его в качестве кеша