APC работает, сохраняя коды операций из файлов PHP в общей памяти. Когда PHP используется с веб-сервером (например, Apache), общая память имеет долгую жизнь. Когда вызывается из командной строки, тогда кеш APC создается и уничтожается для каждого процесса. По умолчанию APC отключается по умолчанию, вероятно, из-за этого.
У меня есть теория, что преимущества использования APC будут pcntl_fork()
если PHP-процесс будет разветвлен (с pcntl_fork()
поскольку, возможно, используется один и тот же кеш-код операции. Это может применяться только к файлам, включенным после fork.
Каков наилучший способ проверить это? Может ли кто-либо проверить это или объяснить, правильна ли теория или нет?
<?php if (pcntl_fork()) { // parent include 'huge-file.php'; } else { // child sleep(1); // stop race condition include 'huge-file.php'; // will this use APC's cache? }
APC оказывает влияние на режим CLI в двух случаях:
Обратите внимание, что APC отключает себя в CLI по умолчанию; вы должны включить его с apc.enable_cli=1
.
Вот быстрый тест:
<?php for ($i = 0; $i < 1000; ++$i) { // cache.php contains the output of 'var_export(get_defined_constants(true))' require 'cache.php'; }
Результат без apc:
$ time php test.php real 0m1.219s user 0m1.208s sys 0m0.008s
Результат с помощью apc:
$ time php -dapc.enable_cli=1 test.php real 0m0.252s user 0m0.244s sys 0m0.004s
В этом случае APC оказывает значительное влияние на производительность.
С помощью pcntl_fork () APC должен иметь точно такое же влияние, как запуск нескольких PHP-скриптов в mod_php apache или php-fpm: если несколько дочерних скриптов содержат одни и те же файлы, включенные файлы будут обрабатываться только один раз.
В PHP 5.5 добавленное расширение opcache, заменяющее APC, также оптимизирует код, поэтому это должно не только влиять на производительность, но и производительность самого кода.