Что такое акселератор APC

debian apc php caching

Обзор APC

APC – это аббревиатура от Alternative PHP Caching. Как и другие популярные кэшеры, такие как XCache и eAccelerator, он используется для увеличения скорости работы PHP скриптов. Если вы имеете собственный сервер, и вас волнуют вопросы быстродействия PHP скриптов, то APC может стать решением вашей проблемы. В сегодняшней статье мы более подробно узнаем о APC, научимся его устанавливать и тестировать, использовать APC кеширование при написании PHP скриптов.

Акселератор APC - бесплатный и открытый opcode кэшер для PHP. Он был задуман, как бесплатный, открытый и стабильный фреймворк для кэширования и оптимизации исходного кода PHP. APC находится на стадии своего развития.  На данный момент поддерживает PHP 4 и PHP 5, включая 5.3. Предположительно будет включен в стандартное ядро PHP шестой версии.

Каким образом достигается ускорение работы

Когда идет задержка загрузки вашего сайта, возникает вопрос – Почему Дело в том, что при выполнении стандартного обращения к PHP скрипту, каждый раз он компилируется заново. То есть, одна и та же работа делается несколько раз. Если это маленький проект, замедления в работе могут быть незначительными, даже невидимыми. Но если у вас большой проект (сайт), то вы замечали, что при обращении идет задержка загрузки страницы, несмотря на то, что сайт хорошо оптимизирован, в плане сжатия html и CSS. Для наглядности, посмотрим, как выполняется стандартный запрос без использования PHP акселераторов:

7057ccec6234071b2915deab115b5a3c.png

При этом идут выполнения компиляции кода при каждом запросе. Это отнимает много время на обработку запроса, потому и тормозит. Для обхода этого и придумали акселераторы, представителем которого является APC. Они кэшируют скомпилированный код на диске, после обращения к которому, он выводит результат. Таким образом увеличивается скорость работы PHP. APC может работать в двух режимах, которые настраиваются в файле /etc/php.d/apc.ini, переменная apc.stat.

Переменная может принимать значения 1 и 0 (apc.stat=0 или apc.stat=1). При использование режима apc.stat=1 несколько замедляется работа скриптов так, как идет проверка на модификацию файла, но это позволяет избежать проблем, когда код изменен, а выдача результата остается прежней. Поэтому советую поставить значение переменной 1.

После установки акселератора APC, схема выполнения запроса будет следующей:

13dd463fee875d0e2f483ae87f3395fe.png

Установка APC

APC очень простой в установке. Его можно устанавливать как на Debian/Ubuntu, так и на другие дистрибутивы.

CentOS, RHEL, Fedora

Будем устанавливать через PECL. Сначала подключаем .repo, который содержит актуальный APC. Смотрите пример ниже:

wget http://rpm.scwlab.com/el/php/yum.conf -O /etc/yum.repos.d/stalwart.repo
yum install php-pecl-apc

Теперь, измените настройки файла /etc/php.d/apc.ini на свой вкус и сделайте рестарт сервера.

Debian, Ubuntu

apt-get install apache2-threaded-dev php5-dev php-pear make gcc g++
pecl install apc

После загрузки, откройте файл по адресу /etc/php5/apache2/php.ini, добавьте параметр extension=apc.so, и перезапустите сервер.

Как видите, установить APC на Debian или Ubuntu, достаточно просто, нужно набрать в консоли команду aptitude install php-apc. Также можно установить это расширение через synaptic. Если у вас другой дистрибутив, то вы можете установить пакет APC из PECL. Для этого выполните в консоле следующую команду sudo pecl install apc.

Проверка наличия пакета APC

Если в файле настроек php.ini, присутствует строка загрузки пакета extension=apc.so. Или создан файл apc.ini с идентичной строкой, в папке конфигурации расширений PHP. У каждого дистрибутива, он находится по своему адресу. Для Debian, это /etc/php5/apache2/conf.d/.

Если вы проверили и убедились, что все хорошо, перезапустите сервер. Теперь проверим информацию о самом пакете APC.

Для этого найдите папку в которой было установлено расширение. В папке вы найдете файл по имени apc.php. Этот файл, также присутствует в архиве установки. Скопируйте его в любую директорию из сайтов вашего сервера. Если пакет был установлен успешно, то при загрузке этого файла, вы увидите следующую таблицу информации о текущем APC пакете.

f6833008d04128e709e63791af513005.jpe

fc70b34d243bdd10ae64f5dadee322eb.gif

2f40ef8eddce87aaecafb6c7f1a30c81.gif

Использование APC в PHP

Использовать расширение APC при написании PHP кода, очень просто и удобно.

APC class

Для начала, мы напишем класс, для работы с памятью через APC систему кэширования. Создайте файл и поместите туда код по следующему адресу: classes/apc.caching.php

<?php
class CacheAPC {
    var $iTtl = 600; // Time To Live
    var $bEnabled = false; // APC enabled
    // конструктор
    function CacheAPC() {
        $this->bEnabled = extension_loaded('apc');
    }

    // получаем данные с памяти
    function getData($sKey) {
        $bRes = false;
        $vData = apc_fetch($sKey, $bRes);
        return ($bRes)  $vData :null;
    }

    // сохраняем данные в память
    function setData($sKey, $vData) {
        return apc_store($sKey, $vData, $this->iTtl);
    }

    // удаляем данные с памяти
    function delData($sKey) {
        $bRes = false;
        apc_fetch($sKey, $bRes);
        return ($bRes)  apc_delete($sKey) : true;
    }
}

?>

В классе описано, что делает каждая из функций. Теперь создадим тестовый файл.

index1.php

<?php
$aData = array(
    'name' => 'table',
    'color' => 'brown',
    'size' => array(
        'x' => 200,
        'y' => 120,
        'z' => 150,
    ),
    'strength' => 10,
);

require_once('classes/apc.caching.php');
$oCache = new CacheAPC();
echo 'Данные: <pre>'; // Посмотрим что мы имеем
print_r($aData);
echo '</pre>';
if ($oCache->bEnabled) { // Если APC доступен
    $oCache->setData('my_object', $aData); // Сохраняем данные в памяти
    $oCache->setData('our_class_object', $oCache); // Сохраняем объект класса в памяти
    echo 'По теории, мы сохранили данные в памяти, нажмите <a href="ndex2.php">здесь</a> для проверки, действительно ли все там.';

} else {
        echo 'Пакет APC не установлен, установите, а потом будете тестировать!';
}

?>

В этом файле мы сохранили 2 объекта в память: массив и объект класса. Теперь создадим второй файл.

index2.php

<?php
require_once('classes/apc.caching.php');
$oCache = new CacheAPC();

if ($oCache->bEnabled) { // Если APC доступен
    $aMemData = $oCache->getData('my_object'); // Получаем данные из памяти
    $aMemData2 = $oCache->getData('our_class_object'); // получаем данные из памяти, которые в классе
    echo 'Данные в памяти: <pre>'; // проверим, что у нас в памяти
    print_r($aMemData);
    echo '</pre>';
    echo 'Данные из памяти объекта CacheAPC class: <pre>';
    print_r($aMemData2);
    echo '</pre>';
    echo 'Как видите все данные доступны, теперь давайте извлечем их из памяти, для этого идем <a href="index3.php">сюда</a>…';

} else {
    echo 'Пакет APC не установлен, установите, а потом будете тестировать!';
}

?>

В данном скрипте, мы только читаем информацию из памяти. Как вы видите, вся информация отлично считывается с памяти. Давайте посмотрим последний пример.

index3.php

<?php
require_once('classes/apc.caching.php');
$oCache = new CacheAPC();

if ($oCache->bEnabled) { // Если APC доступен
    $oCache->delData('my_object'); // Извлечение данных из памяти
    $oCache->delData('our_class_object'); // Извлечение данных из памяти
    $aMemData = $oCache->getData('my_object'); // пытаемся получить данные обратно
    $aMemData2 = $oCache->getData('our_class_object');
    echo 'Данные из памяти: <pre>'; // Проверим, что у нас хранится в памяти
    print_r($aMemData);
    echo '</pre>';
    echo 'Данные из памяти объекта CacheAPC class: <pre>';
    print_r($aMemData2);
    echo '</pre>';
    echo 'Как видите все данные извлечены из памяти. Ура!';

} else {
    echo 'Пакет APC не установлен, установите, а потом будете тестировать!';
}

?>

Опробовал на сайте rusem.ru 03.02.16 - производительность UMI.CMS поднялась с 20 до 46 единиц.