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