PHP APC в режиме CLI - PullRequest
       35

PHP APC в режиме CLI

17 голосов
/ 07 августа 2009

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

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

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

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

Ответы [ 4 ]

26 голосов
/ 07 августа 2009

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

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

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

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


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

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

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

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

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


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

3 голосов
/ 24 мая 2013

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

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

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

echo 'apc.enable_cli = 1' > /etc/php5/cli/conf.d/enable-apc-cli.ini
3 голосов
/ 13 января 2011

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

2 голосов
/ 28 июня 2011

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

...