Эффективным способом снижения нагрузки, создаваемой PHP-скриптами, является установка PHP-акселераторов. Рассмотрим установку и настройку одного из них - eAccelerator.
eAccelerator - это бесплатный PHP ускоритель и оптимизатор с открытым исходным кодом. Он увеличивает производительность PHP скриптов за счет кэширования их в скомпилированном состоянии, в результате чего почти полностью устраняются накладные расходы на их компиляцию. Он так же оптимизирует скрипты, чтобы ускорить их выполнение. eAccelerator обычно уменьшает нагрузку на сервер и увеличивает скорость их выполнение в 1-10 раз.
eAccelerator хранит скомпилированные PHP скрипты в общей (shared) памяти и выполняет код непосредственно из нее. Это создает блокировки только на короткое время при поиске скомпилированного PHP скрипта в кэше, поэтому один скрипт может выполняться одновременно нескольколькими движками. Файлы, которые не помещаются в общей памяти, кэшируются только на диске.
Последний релиз 0.9.6.1 от 31-го мая 2010 г. поддерживает все версии PHP 4 и PHP 5, включая 5.3.
Требования:
- apache 1.3 и выше
- PHP 4.1 и выше
- php-devel
- autoconf
- automake
- libtool
- m4
Установка eAccelerator
- Заходим в Shell своего сервера, используя SSH root доступ. Подразумевается что apache/httpd + php у вас уже установлены. Вам может понадобиться дополнительное ПО. В этом случае установим его через yum:
yum install php-devel
yum install autoconf
yum install automake
yum install libtool
- Cкачиваем последний дистрибутив с сайта-разработчика (на момент написания статьи последней версией является 0.9.6.1), распаковываем его и переходим в каталог с распакованными файлами:
mkdir temp
cd /temp/
wget http://sourceforge.net/projects/eaccelerator/files/eaccelerator/eAccelerator%200.9.6.1/eaccelerator-0.9.6.1.tar.bz2
bzip2 -d eaccelerator-0.9.6.1.tar.bz2
tar xf eaccelerator-0.9.6.1.tar
cd /temp/eaccelerator-0.9.6.1
- Проверяем, где находится phpize, необходимый для компиляции модулей php:
whereis phpize
Обычно путь до файла /usr/bin/phpize или /usr/local/bin/phpize.
- Выполняем компиляцию eAccelerator:
phpize
./configure
make
или
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
./configure \
--enable-eaccelerator=shared \
--with-php-config=$PHP_PREFIX/bin/php-config
make
или
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
make
или
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config --with-eaccelerator-shared-memory
Опция --with-eaccelerator-shared-memory необходима для возможности использования API eAccelerator. Полный список опций.
- Устанавливаем eAccelerator:
make install
- Настраиваем eAccelerator:
eAccelerator может быть сконфигурирован в двух вариантах: как Zend-дополнение или как дополнение к PHP. Если вы хотите установить eAccelerator как Zend-дополнение, вам нужно указать полный путь к библиотеке eaccelerator.so (/usr/lib/php4/eaccelerator.so для PHP 4 или /usr/lib/php/eaccelerator.so для PHP 5). Конфигурацию eAccelerator можно разместить в виде файла eaccelerator.ini в директории /etc/php.d/ или указать в файле php.ini (обычно он находится в /etc/php.ini или /usr/local/lib/php.ini). Добавляем в самый конец php.ini следующие строки:
extension="eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="5"
Или для варианта использования eAccelerator как расширение Zend:
zend_extension="/usr/lib/php4/eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="5"
При наличии в php.ini директивы extension_dir путь к расширению указываем относительный, иначе перед блоком настроек eAccelerator добавляем:
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613"
- Создаем каталог, который будет использоваться для кэша:
mkdir /var/cache/eaccelerator
chmod 777 /var/cache/eaccelerator
- Перезапускаем apache:
service httpd restart
или
/etc/rc.d/init.d/httpd restart
- Проверяем, как работает eAccelerator:
php -v
В результате вы должны увидеть информацию о версии eAccelerator вида "with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator".
Или создайте php-файл со следующим содержимым:
<?php phpinfo(); ?>
При его выполнении должна появиться отдельная секция с описанием настроек eAccelerator.
Если через некоторое время в каталоге /var/cache/eaccelerator появились подкаталоги 1, 2, 3... - eAccelerator работает.
Описание некоторых параметров конфигурации eAccelerator
Параметр | Описание |
eaccelerator.shm_size | Размер кэша совместно используемой памяти, устанавливается в мегабайтах |
eaccelerator.cache_dir | Директория для дискового кэша. eAccelerator сохраняет в указанной директории бинарное представление кода, сессии и другие данные |
eaccelerator.enable | С помощью этой опции можно отключать и включать eAccelerator. Значение 1 - включено, 0 - выключено |
eaccelerator.optimizer | Подключить или отключить встроенный оптимайзер, которые увеличивает скорость выполнения кода |
eaccelerator.check_mtime | Включаем проверку модификации PHP файлов. Поставьте "1" если требуется, чтобы проверялись все модифицированные файлы и перекомпиливались заново |
eaccelerator.debug | Режим отладки. По умолчанию 1. При большой посещаемости может сильно увеличить размер логов Apache |
eaccelerator.filter | Какие файлы должны кешироватья. По умолчанию кешируются все файлы |
eaccelerator.shm_max | Максимально допустимое значение, которое может быть отправлено в разделяемую память. По умолчанию 0 - без ограничений. Размер указывается в байтах, но можно указать приставки, например: 10240, 10K, 1M |
eaccelerator.shm_ttl | Указывает в секундах время, по истечении которого давно не используемый код должен быть удален из совместно используемой памяти при превышении объема выделяемой памяти. По умолчанию эта опция отключена, мы рекомендуем устанавливать значение от 60 до 300 при большом количестве файлов и от 900 до 1800 при малом количестве файлов. |
eaccelerator.shm_prune_period | Когда eAccelerator не имеет достаточно свободного памяти, он пытается удалить старые данные, если предыдущая попытка была сделана более "shm_prune_period" секунд назад. По умолчанию значение "0", при котором eAccelerator не будет пытаться удалить старый данные из памяти. |
eaccelerator.keys eaccelerator.session eaccelerator.content | Параметры указывают доступные способы сохранения кэша eAccelerator.
Возможные значения:
- shm_and_disk - кэш данных в общей памяти и на диске (по умолчанию);
- shm - кэш данных в общей памяти или на диске, если общая память или размер данных больше, чем "eaccelerator.shm_max";
- shm_only - кэш данных в общей памяти;
- disk_only - кэш данных на диске;
- none не кэшироваь данные.
| eaccelerator.compress | Включить или отключить сжатие закешированного контента. По умолчанию 1 - сжимать |
eaccelerator.compress_level | Уровень сжатия. По умолчанию 9 - максимум |
eaccelerator.allowed_admin_path | Устанавливает путь к контрольной панеле |
Дополнительная информация
- Отсутствует gcc и make. Необходимо установить gcc и make:
yum install gcc
yum install make
- Отсутствует phpize. Необходимо установить php-devel
yum install php-devel
- С некоторыми версиями eAccelerator есть проблема с open_basedir. Решается патчем. Перед компиляцией eAccelerator в файле eaccelerator.c поменять строку. Для 0.9.6:
if (PG(open_basedir) && php_check_open_basedir(realname TSRMLS_CC)) {
на:
if (PG(open_basedir) && php_check_open_basedir(file_handle->filename TSRMLS_CC)) {
Для 0.9.6.1:
if (php_check_open_basedir(realname TSRMLS_CC)) {
на:
if (php_check_open_basedir(p->realfilename TSRMLS_CC)) {
При использовании директивы PHP open_basedir для обеспечения безопасности, нужно собрать eAccelerator с опцией "--without-eaccelerator-use-inode". Данный механизм хранения кэша не совместим с open_basedir, поэтому open_basedir в сочетании с этой опцией приводит к фатальным ошибокам в скриптах:
phpize
./configure --without-eaccelerator-use-inode
make
make install
Если не помогло, тогда устанавливаем версию 0.9.5.3:
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
- Для исправления ошибки 'zend_property_info' really has no member 'ce' перед компиляцией eAccelerator в файле ea_store.c меняем код:
zend_property_info* parent_info = NULL;
return (child_info->ce != from);
if (parent && zend_hash_quick_find(&parent->properties_info, p->arKey, p->nKeyLength, p->h, (void **) &parent_info)==SUCCESS) {
на
zend_property_info* parent_info = NULL;
#ifdef ZEND_ENGINE_2_2
return (child_info->ce != from);
#endif
if (parent && zend_hash_quick_find(&parent->properties_info, p->arKey, p->nKeyLength, p->h, (void **) &parent_info)==SUCCESS) {
- Ошибка [Zend Optimizer] Zend Optimizer 3.3.3 is incompatible with eAccelerator 0.9.6.1 in Unknown on line 0. Варианты решения:
- В файле php.ini подключить eAccelerator как дополнение к PHP.
- В файле php.ini подключить eAccelerator перед подключением Zend Optimizer.
- Установить eAccelerator версии 0.9.5.
- Установить Zend Optimizer версии 3.2.8
- В некоторых системах при задании размера кеша eAccelerator более 32Mb может возникнуть ошибка 502 Internal Server Error. Для решения проблемы необходимо в файле /etc/sysctl.conf прописать значение kernel.shmmax. Например, для eaccelerator.shm_size="64" задаем kernel.shmmax = 67108864 (64*1024*1024).
- После выполнения команды make install печатается каталог, в который установлен eAccelerator. Например:
Installing shared extensions:
/usr/local/lib/php/extensions/no-debug-non-zts-20060613/
Для указания пути без подкаталога необходимо скопировать модуль eaccelerator.so в общий каталог расширений PHP:
cp /usr/local/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so /usr/local/lib/php/extensions/eaccelerator.so
- Если понадобится обновить PHP, то после его обновления обязательно нужно переустановить eAccelerator. Для этого необходимо:
- удалить старое расширение eaccelerator.so из каталога с расширениями PHP (обычно это /usr/local/lib/php/extensions/);
- обновить пакет php5-dev:
aptitude update
apt-get install php5-dev
- переустановить eAccelerator;
- перезапустить веб-сервер.
- После установки eAccelerator может перестать работать PHPMyAdmin (будет открываться белая страница). В этом случае нужно отключить eAccelerator для директории /usr/share/phpmyadmin в конфигурационном файле apache:
<Directory /usr/share/phpmyadmin>
php_admin_value eaccelerator.enable 0
</Directory>
- Принудительная очистка файлового кэша. С целью недопущения исчерпания дискового пространства под устаревшие кэши eAccelerator рекомендуем очищать файлы, созданные более 12 часов назад:
tmpwatch --mtime --all 12 /tmp/eaccelerator
- Во FreeBSD eAccelerator можно установить из портов:
whereis eaccelerator
eaccelerator: /usr/ports/www/eaccelerator
cd /usr/ports/www/eaccelerator
make install clean
- Установка для Windows. Загрузите бинарные файлы для установленной версии PHP 4 или PHP 5.
В директорию диск:\{путь к PHP}\ext\ разместите загруженную dll, предварительно переименовав ее в eaccelerator.dll, создайте директорию для файлов eAccelerator, например, по адресу c:\tmp\eaccelerator.
В php.ini добавьте строку extension="eaccelerator.dll" и разместите конфигурацию eAccelerator, например:
eaccelerator.shm_size="64"
eaccelerator.cache_dir="c:\tmp\eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="1800"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
# Раскомментировать при необходимости сохранения кэша только в памяти
#eaccelerator.keys = "shm"
#eaccelerator.sessions = "shm"
#eaccelerator.content = "shm"
Перезапустите службу Apache.
- Ошибки:
/usr/src/eaccelerator-0.9.6.1/ea_store.c: In function 'store_property_access_check':
/usr/src/eaccelerator-0.9.6.1/ea_store.c:683: error: 'zend_property_info' has no member named 'ce'
/usr/src/eaccelerator-0.9.6.1/ea_store.c:685: warning: dereferencing type-punned pointer will break strict-aliasing rules
Решение: установить eAccelerator 0.9.6
|