Что такое акселератор 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, достаточно просто, нужно набрать в консоли команду sudo 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 не установлен, установите, а потом будете тестировать\!';
}

?>

Комментарий aizaro

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