APC в PHP: Понятие, установка, использование APC
APC – это аббревиатура от Alternative PHP Caching. Русским текстом – это альтернативный PHP кэшер. Для чего он используется? Как и другие популярные кэшеры, такие как XCache и eAccelerator, он используется для увеличения скорости работы PHP скриптов. Если вы имеете собственный сервер, и вас волнуют вопросы быстродействия 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. Они кэшируют скомпилированный код на диске, после обращения к которому, он выводит результат. Таким образом увеличивается скорость работы 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, так и на другие дистрибутивы.
Установка 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 в PHP
Использовать расширение APC при написании PHP кода, очень просто и удобно. Сейчас вы сами убедитесь в этом.
Для начала, мы напишем класс, для работы с памятью через APC систему кэширования. Создайте файл и поместите туда код по следующему адресу:
classes/apc.caching.php
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
'table', 'color' => 'brown', 'size' => array( 'x' => 200, 'y' => 120, 'z' => 150, ), 'strength' => 10, ); require_once('classes/apc.caching.php'); $oCache = new CacheAPC(); echo 'Данные:'; // Посмотрим что мы имеем print_r($aData); echo ''; if ($oCache->bEnabled) < // Если APC доступен $oCache->setData('my_object', $aData); // Сохраняем данные в памяти $oCache->setData('our_class_object', $oCache); // Сохраняем объект класса в памяти echo 'По теории, мы сохранили данные в памяти, нажмите здесь для проверки, действительно ли все там.'; > else < echo 'Пакет APC не установлен, установите, а потом будете тестировать!'; >?>
В этом файле мы сохранили 2 объекта в память: массив и объект класса. Теперь создадим второй файл.
index2.php
bEnabled) < // Если APC доступен $aMemData = $oCache->getData('my_object'); // Получаем данные из памяти $aMemData2 = $oCache->getData('our_class_object'); // получаем данные из памяти, которые в классе echo 'Данные в памяти:'; // проверим, что у нас в памяти print_r($aMemData); echo ''; echo 'Данные из памяти объекта CacheAPC class:
'; print_r($aMemData2); echo ''; echo 'Как видите все данные доступны, теперь давайте извлечем их из памяти, для этого идем сюда…'; > else < echo 'Пакет APC не установлен, установите, а потом будете тестировать!'; >?>
В данном скрипте, мы только читаем информацию из памяти. Как вы видите, вся информация отлично считывается с памяти. Давайте посмотрим последний пример.
index3.php
bEnabled) < // Если APC доступен $oCache->delData('my_object'); // Извлечение данных из памяти $oCache->delData('our_class_object'); // Извлечение данных из памяти $aMemData = $oCache->getData('my_object'); // пытаемся получить данные обратно $aMemData2 = $oCache->getData('our_class_object'); echo 'Данные из памяти:'; // Проверим, что у нас хранится в памяти print_r($aMemData); echo ''; echo 'Данные из памяти объекта CacheAPC class:
'; print_r($aMemData2); echo ''; echo 'Как видите все данные извлечены из памяти. Ура!'; > else < echo 'Пакет APC не установлен, установите, а потом будете тестировать!'; >?>
Заключение
Спасибо за ваше внимание! Надеюсь вам было интересно почитать об использовании APC в PHP. Если вы имеете другие представления об использовании APC при написании PHP скриптов, напишите об этом в комментариях.
Асинхронные вызовы процедур
Асинхронный вызов процедуры (APC) — это функция, которая выполняется асинхронно в контексте определенного потока. Когда APC помещается в очередь в поток, система выдает прерывание программного обеспечения. При следующем планировании потока будет запущена функция APC. APC, созданный системой, называется APC в режиме ядра. APC, созданный приложением, называется APC в пользовательском режиме. Чтобы запустить APC в пользовательском режиме, поток должен находиться в состоянии предупреждения.
Каждый поток имеет собственную очередь APC. Приложение помещает APC в очередь в поток, вызывая функцию QueueUserAPC . Вызывающий поток указывает адрес функции APC в вызове QueueUserAPC. Очередь APC — это запрос потока на вызов функции APC.
Когда APC в пользовательском режиме помещается в очередь, поток, к которому он находится в очереди, не направляется на вызов функции APC, если только он не находится в состоянии предупреждения. Поток переходит в состояние оповещения при вызове функции SleepEx, SignalObjectAndWait, MsgWaitForMultipleObjectsEx, WaitForMultipleObjectsEx или WaitForSingleObjectEx . Если ожидание выполнено до постановки APC в очередь, поток больше не находится в состоянии ожидания с возможностью предупреждения, поэтому функция APC не будет выполняться. Однако APC по-прежнему находится в очереди, поэтому функция APC будет выполняться, когда поток вызывает другую функцию ожидания с оповещением.
Если вы используете пул потоков, обратите внимание, что APC не работают так же, как другие механизмы сигнализации, так как система управляет временем существования потоков пула потоков, поэтому поток может быть завершен до доставки уведомления. Вместо использования механизма сигнализации на основе APC, например параметра pfnCompletionRoutinesetWaitableTimer или SetWaitableTimerEx, используйте объект для ожидания, например таймер, созданный с помощью CreateThreadpoolTimer. Для операций ввода-вывода используйте объект завершения ввода-вывода, созданный с помощью CreateThreadpoolIo, или структуру OVERLAPPED на основе hEvent, в которой событие можно передать в функцию SetThreadpoolWait.
Внутренние службы синхронизации
При выдаче запроса ввода-вывода выделяется структура для представления запроса. Эта структура называется пакетом запроса ввода-вывода (IRP). При синхронном вводе-выводе поток создает IRP, отправляет его в стек устройств и ожидает завершения его в ядре. При использовании асинхронного ввода-вывода поток создает IRP и отправляет его в стек устройств. Стек может завершить IRP немедленно или вернуть состояние ожидания, указывающее, что запрос выполняется. В этом случае IRP по-прежнему связан с потоком, поэтому он будет отменен, если поток завершается или вызывает функцию , например CancelIo. В то же время поток может продолжать выполнять другие задачи, пока стек устройств продолжает обрабатывать IRP.
Существует несколько способов, которыми система может указать, что IRP завершен.
- Обновите перекрываемую структуру с помощью результата операции, чтобы поток смог опросить, завершена ли операция.
- Сообщите о событии в перекрывающейся структуре, чтобы поток смог синхронизироваться с событием и разбудиться после завершения операции.
- В очереди IRP в ожидающий APC потока, чтобы поток выполнял подпрограмму APC, когда он переходит в состояние ожидания с оповещением, и возвращался из операции ожидания с состоянием, указывающим, что он выполнил одну или несколько подпрограмм APC.
- Поставить IRP в очередь на порт завершения ввода-вывода, где он будет выполняться следующим потоком, ожидающим порта завершения.
Потоки, ожидающие завершения ввода-вывода через порт ввода-вывода, не ожидаются в состоянии предупреждения. Таким образом, если эти потоки выдают irP, которые настроены для завершения в качестве APC для потока, эти завершения IPC не будут выполняться своевременно; Они будут возникать только в том случае, если поток получает запрос от порта завершения ввода-вывода, а затем вводит оповещенное ожидание.
При подготовке материала использовались источники:
https://sitear.ru/material/apc-php
https://learn.microsoft.com/ru-ru/windows/win32/sync/asynchronous-procedure-calls