Может ли APC улучшить скорость сценариев CLI при использовании с pcntl_fork ()?

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

У меня есть теория, что использование 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?
}

person dave1010    schedule 24.05.2013    source источник
comment
Звучит возможно, но я не думаю, что вы ощутите большую пользу, если бы вам не пришлось разветвлять один скрипт на множество дочерних процессов и многократно включать файлы в каждый из них.   -  person Mahn    schedule 24.05.2013


Ответы (1)


APC влияет на режим командной строки в двух случаях:

  • Один и тот же файл включается повторно либо одним и тем же сценарием (например, файл, содержащий некоторый кеш данных), либо несколькими процессами.
  • Вы используете apc_fetch () (всегда возвращает false, если apc отключен)

Обратите внимание, что APC по умолчанию отключается в интерфейсе командной строки; вы должны включить его с помощью 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 под apache mod_php или php-fpm: если несколько дочерних сценариев включают одни и те же файлы, включенные файлы будут проанализированы только один раз.


В PHP 5.5 связанное расширение opcache, заменяющее APC, также оптимизирует код, поэтому оно должно влиять не только на производительность require, но и на производительность самого кода.

person Arnaud Le Blanc    schedule 24.05.2013