Войти Регистрация

APC в PHP: Понятие, установка, использование APC



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

Сегодня мы узнаем

Что такое APC

Установка APC

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

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

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

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

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

Выполнение запроса без APC

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

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

Применение APC для PHP

Установка APC

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

Установка APC на 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 на свой вкус и сделайте рестарт сервера.

Установка APC на Debian, Ubuntu

apt-get install apache2-threaded-dev php5-dev php5-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. Этот файл, также присутствует в архиве установки. Скопируйте его в любую директорию из сайтов вашего сервера. Например, что-бы он был доступен по адресу http://sitear.ru/apc.php. Если пакет был установлен успешно, то при загрузке этого файла, вы увидите следующую таблицу информации о текущем APC пакете.

Информация о пакете APC

Использование памяти расширением APC

Статус хоста

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

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

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

classes/apc.caching.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;

    }

}

 

?>

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

index.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 не установлен, установите, а потом будете тестировать!';

}

 

?>

Заключение

Спасибо за ваше внимание! Надеюсь вам было интересно почитать об использовании APC в PHP. Если вы имеете другие представления об использовании APC при написании PHP скриптов, напишите об этом в комментариях. 



Дальше: Счетчик подписчиков FeedBurner на PHP


Дискуссия по теме    15 Комментариев
Добавить комментарий
Alex 22.01.2016 в 12:43
Благодарю! Подробно и ёмко освещено!
Сергей 26.06.2014 в 08:03
Здравствуйте, статья отличная! Я пользуюсь хостингом, там за доп. плату подключил персональный веб-сервер с модулями APC, eAccelerator и XCache. Сейчас включен только APC т.к. с eAccelerator и XCache у них конфликт. Скажите пожалуйста, какой модуль лучше? И как влияет на дальнейшую работу сайта эти модули, я имею ввиду в будущем не будет ли загружаться память на сервере или хостинге. Прошу прощение за тупость. Спасибо
Вадим 20.06.2014 в 08:20
Спасибо Вам за чудесную статью!
Генадий 19.07.2013 в 20:42
и чего ? Интерпретатор компилирующего типа - это означает то что Php может компилировать код, но это не значит что это компилируемый язык. Если бы был опыты работы с нормальными компилируемыми языками программирования, никогда бы не назвали компилируемым то что не компилируется
Тарас 19.07.2013 в 23:08
Цитата с википедии: "Интерпретатор компилирующего типа — это система из компилятора, переводящего исходный код программы в промежуточное представление, например, в байт-код или p-код, и собственно интерпретатора, который выполняет полученный промежуточный код (так называемая виртуальная машина)." Насколько я понимаю, сразу код компилируется в байт-код, после чего последний интерпретируется. Даже, согласно Вашим словам: "Php может компилировать", я могу использовать в статье словосочетание "компиляция кода". Собственно, что не так в тексте статьи? Укажите цитату, я пересмотрю, исправлю.
xaseros 31.10.2014 в 13:59
Идите и комментируйте статьи к "нормальным компилируемым" языкам. Ваше высокомерие можете оставить при себе. Что до формы, то компиляция или интерпретация это лишь методики перевода кода программы на языке программирования, в код исполняемый процессором или виртуальной машиной. И в php давно уже используются обе методики. Да почти во всех платформах для разработки можно увидеть совмещение этих двух подходов.Даже программы на C предварительно, построчно проверяются препроцессором и линковщиком. Так, что нет никакого повода упрекать php (и тех кто на нем пишет) в этом плане.
Генадий 18.07.2013 в 18:35
А вы в курсе что PHP это интерпретируемый язык а не компилируемый ? Что в нем компилируется ?
Тарас 19.07.2013 в 02:43
Точно! А еще точнее "Тип исполнения: интерпретатор компилирующего типа" http://ru.wikipedia.org/wiki/PHP
Count Raven 08.11.2012 в 10:30
Блин, картинке ошибка. Что 3-й класс школы - не, не слышал? МодифицЫровался через И пишется, вообще всегда после Ц идет И, а не Ы в подобных случаях, только если на конце, то Ы, например, птицы.
Тарас 08.11.2012 в 23:02
В вашем комментарии также ошибка - "Блин, картинке ошибка." Там должна быть буква "В".
vitalik 16.12.2012 в 14:15
Для этого "умника" есть хорошая поговорка. Глупость все видит; разум многое не станет замечать. (Б.Ф.Андреев)
Count Raven 16.12.2012 в 17:45
У меня это просто опечатка, тем более, в комментарии. Это не ошибка. А вот на изображении в статье действительно ошибка, которую неплохо было бы поправить.
Димчег 16.02.2014 в 18:45
Ага, конечно. Цыган на цыпочках подошел к цыпленку и цыкнул: «Цыц.
Nikolay 07.09.2012 в 01:11
У вас небольшая ошибочка по тексту: "Они кэшируют скомпилированный код на диске". Опкод кешируется не на диске, а в оперативной памяти.
vitalik 16.12.2012 в 14:08
Вы наверно не в курсе, что можно создать диск и в оперативной памяти? Почитайте хотя бы чем инстинктивно писать.
Добавить комментарий
Просмотров: 59065