Может ли APC повысить скорость сценариев CLI при использовании с pcntl_fork()?
APC работает, храня коды операций из файлов PHP в общей памяти. Когда PHP используется с веб-сервером (например, Apache), общая память имеет длительный срок службы. При вызове из командной строки кэш APC создается и уничтожается для каждого процесса. APC отключен на commadnline по умолчанию, возможно, из-за этого.
У меня есть теория, что использование APC будет полезным, если процесс PHP разветвлен (с pcntl_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?
}
1 ответ
APC оказывает влияние в режиме CLI в двух случаях:
- Один и тот же файл включается многократно, либо одним и тем же сценарием (например, файлом, содержащим некоторый кеш данных), либо несколькими процессами.
- Вы используете apc_fetch () (всегда возвращает false, если apc отключен)
Обратите внимание, что 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 или php-fpm apache: если несколько дочерних сценариев содержат одни и те же файлы, включенные файлы будут проанализированы только один раз.
В PHP 5.5 встроенное расширение opcache, заменяющее APC, также оптимизирует код, поэтому оно должно не только влиять require
производительность, но и производительность самого кода.