Анкета для регистрации интернет-ресурса
В соответствии с Указом Президента Республики Беларусь № 60 от 01.02.2010г.
Техподдержка
Приложение support.by

E-mail: ticket@support.by

 

Портал > База знаний > Администрирование Linux > Оптимизация PHP. Часть 1


Оптимизация PHP. Часть 1




Задача:

Увеличение производительности сайта.

Решение:

Для увеличения производительности и скорости работы веб-приложения можно произвести оптимизацию PHP, который отвечает за динамическую составляющую сайта. Для этого можно перевести интерпретатор PHP в один из 3 режимов работы:

  1. PHP как модуль Apache
  2. PHP как CGI,
  3. PHP как FastCGI

PHP как модуль Apache:

В это режиме для запуска PHP используется модуль веб-сервера apache mod_php. В данном режиме скрипты выполняются быстрее всего, так как сервер сам обрабатывает скрипты, однако это дает излишнюю нагрузку на веб-сервер. Для всех скриптов используется общий конфигурационный файл (php.ini). Если скрипт работая в режиме модель apache запустил стороннее приложение, то невозможно будет определить какой пользователь запустил данный скрипт. Так же ошибки в скриптах могут приводить к неработоспособности всего веб-сервера apache.

PHP как CGI:

В это режиме для запуска PHP используется модуль веб-сервера apache mod_cgi. Скрипты передаются посредством данного модуля на вход интерпретатора PHP. В данном режиме скрипты имеют отдельный процесс и выполняются с правами пользователя – владельца www-домена, потребляют меньше оперативной памяти по сравнению с модулем apache и ошибки в скриптах не приводят к неработоспособности всего веб-сервера. Так же, в данном режиме имеется возможность сконфигурировать PHP для каждого пользователя.

PHP как FastCGI:

В это режиме для запуска PHP используется модуль веб-сервера apache mod_fastcgi. Скрипты передаются посредством данного модуля на вход интерпретатора PHP. Отличием от режима PHP как CGI является то, что для скрипта происходит кэширование некоторых промежуточных данных и нет необходимости интерпретировать его каждый раз перед выполнением, за счет этого достигается более высокая скорость выполнения.

Что необходимо для оптимизации PHP

Для повышения производительности PHP необходимо:

  1. Если имеется доступ к управлению программным обеспечением сервера, то следует обновиться до последней версии PHP 5.6.3.В версии PHP 5.6 реализовано много новых концепций, сделано немалое количество обновлений безопасности, и не следует этими нововведениями пренебрегать. Если же PHP 5.6.* не подходит, то, как минимум обновится до PHP 5.5 или PHP5.5. Версия PHP 5.3 была выпущена почти 4 года назад, она медленнее и потребляет больше памяти, чем новые версии PHP.
  2. Установить один из предкомпиляторов PHP.

Настройка предкомпиляторов PHP:

PHP - движок, который запускает код приложений. Необходимо установить только те модули, которые планируются использоваться для выполнения скриптов, и сконфигурировать веб-сервер apache для использования PHP только для файлов скриптов (обычно те файлы, названия которых заканчиваются на .php), а не всех статических файлов. Кэширование кода операции: Когда запрашивается скрипт PHP, PHP читает скрипт и собирает его в то, что называется код операции Zend, бинарное представление кода, который будет выполнен. Этот код операции затем выполняется движком PHP и теряется. Кэширование кода операции сохраняет его и в следующий раз при запросе страницы вновь использует, это экономит немало времени. Акселератор PHP — расширение для PHP, основное назначение которого - увеличение производительности интерпретатора при обработке сценариев путем кэширования их байт-кода. Как выглядит обработка сценария на PHP обычным интерпретатором:

  1. Чтение файла.
  2. Генерация байт кода.
  3. Выполнение кода.
  4. Выдача результата.

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

  1. Чтение файла.
  2. Проверка, есть ли кэш для файла (создан или истекло время хранения).
  3. Если есть, отдается кэшированный контент.
  4. Если нет, то создается кэш и выдается его содержимое.

Существующие решения

  • APC — хранение данных передается APC, при этом данные хранятся в памяти;
  • XCache — хранение данных передается XCache, при этом данные хранятся в памяти;
  • eAccelerator — хранение данных передается eAccelerator, при этом данные хранятся в памяти или в файлах на диске.
  • Memcached – оперативная в оперативной памяти.

APC XCache eAccelerator:
Недостаток 1: использует общую для скриптов и кэша память.
Недостаток 2: при кэшировании требуется сериализация данных.

Alternative PHP Cache (APC)

The Alternative PHP Cache — бесплатный и открытый opcode кэшер для PHP. Он был задуман, как бесплатный, открытый и стабильный фреймворк для кэширования и оптимизации исходного кода PHP, так же возможно кэширование пользовательских данных. Проект живет и развивается. Поддерживает PHP4 и PHP5, включая 5.3 и 5.4. Это расширение PECL не поставляется вместе с PHP. После установки акселератора APC, схема выполнения запроса будет следующей: Применение APC для PHP:

Установка APC

Для начала надо установить необходимые пакеты:

 # apt-get install apache2-threaded-dev php5-dev php5-pear make gcc g++  

Затем установить APC при помощи pecl: 

 # pecl install apc  

Отредактировать конфигурационный файл: 

 #vi /etc/php5/apache2/php.ini  

Добавить в него следующую строку: 

extension = apc.so
apc.shm_size = 64 //Количество выделяемой оперативной памяти в МБ.
apc.enabled=1 //APC включен. Довольно очевидная настройка, но очень важная. 
//Отключение APC может привести к уменьшению производительности на рабочем сервере.
apc.shm_segments=1
apc.shm_size=32 

Эти настройки показывают сколько памяти выделять под APC. APC.shm_segments=1 - показывает что выделяется один сегмент памяти, а apc.shm_size=32 показывает, что размер этого сегмента 32 мегабайта. Вы можете поменять размер сегмента, скажем на 64 мегабайта и перезапустить Apache. Потом если количество MISS не будет сведено к 1% сделать размер 128 МБ и так далее. Это основной параметр для работы с APC. 

apc.cache_by_default=1 
apc.filters= Работа APC для всех php скриптов. При этом мы можем закомментировать строчку с apc.filters.

apc.stat=1
Этот параметр напрямую влияет на производительность. При включенной настройке кэш в APC остается там пока не будет удален. В случае когда настройка отключена, то APC будет сравнивать время выполнения скрипта и время последнего изменения файла и добавлять в кэш новую версию. Эта настройка необходима для рабочего сервера, однако для разработки эту настройку лучше всего отключить. И еще при включенной настройке apc.stat необходимо очистить кэш APC при обновление модулей и ядра Drupal. 
apc.ttl=0 

Эта настройка показывает через сколько миллисекунд очистить кэш. При 0 кэш не очищается. Поэтому мы ставим 0, мы же не хотим чтобы каждый час нужный нам кэш очищался (по умолчанию 7200, то есть 2 часа). 

 apc.num_files_hint=2048 

Эта настройка может быть очень нужна, когда на сервере несколько сайтов, несколько Drupal. Потому что один Drupal может забивать в кэш более 500 файлов. Чтобы кэш одного сайта не затирал в кэше файлы другого, лучше включить эту настройку побольше (по умолчанию 1024). Для вступления настроек в силу необходимо перезапустить веб-сервер. 

 #/etc/init.d/apache2 restart 

 

Zend OPcache

Zend OPcache — это предкомпилятор PHP кода, разработкой которого занимается команда PHP. Начиная с PHP версии 5.5 он включен в основной пакет расширений PHP, на для более ранних версий его нужно устанавливать отдельно. Установка:

Для установки в PHP 5.5 - 5.6, требуется отредактировать php.ini для вашего сайта, например:

 vi /etc/php.ini  

Найти позицию zend_extension и указать путь к opcache.so и указать минимальные параметры, например:

 zend_extension=/usr/lib64/php/modules/opcache.so  

Пример конфигурации:

zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1  

После выполненных действий перезапустить веб-сервер: 

/etc/init.d/httpd restart
/etc/init.d/apache2 restart  

Рекомендованные минимальные параметры:

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1  

Основные параметры Zend Opcache по параметрам:

Включение/выключение OPcache. В выключенном состоянии код не оптимизируется и не кэшируется. Значение по умолчанию «1».

 opcache.enable=1 

Включение OPcache для CLI-версии PHP. Наилучшим образом подходит для тестирование и отладки. Значение по умолчанию «0».

 opcache.enable_cli=0  

Размер используемой памяти для хранения предкомпилированного PHP-кода. Размер указывается в мегабайтах. Значение по умолчанию «64».

 opcache.memory_consumption=64  

Количество памяти для пула строк в мегабайтах. Значение по умолчанию «4».

 opcache.interned_strings_buffer=4  

Максимальное количество ключей (скриптов) в хэш-таблице OPcache. Число должно быть простым и быть больше, чем те, что приведены в примере:{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793 }. Допустимы числа между 200 и 1000000. Значение по умолчанию «2000».

 opcache.max_accelerated_files=2000  

Максимальный процент “замусоренной” памяти для запланированного перезапуска. Значение по умолчанию «5».

 opcache.max_wasted_percentage=5  

При включении этого параметра, OPcache добавляет текущую рабочую директорию в ключ скрипта для предотвращения возникновения коллизий между файлами с одинаковым именем. Выключение этой функции увеличивает производительность, но может нарушить работу приложений. Значение по умолчанию «1».

 opcache.use_cwd=1  

При отключенном параметре, появляется возможность обнуления OPcache вручную или перезапуском веб-сервера для того, чтобы привести в актуальное состояние данных об изменениях в файлах. Частота проверки управляется параметром «opcache.revalidate_freq». Значение по умолчанию «1».

 opcache.validate_timestamps=1  

Через какой промежуток времени (в секундах) проверять изменения временных меток для поддержания данных в памяти в актуальном состоянии. (“1” означает проверку с периодичностью раз в секунду для запроса, “0” - постоянная проверка). Значение по умолчанию «2».

 opcache.revalidate_freq=2  

Предотвращает кэширование файлов, которые были изменены меньше, чем в указанное время (в секундах). Эта возможность защищает не полностью обновленные файлы от кэширования. В случае мгновенного обновления всех файлов, для увеличения производительности установите параметр равный “0”. Значение по умолчанию «2».

 opcache.file_update_protection=2  

Включение или отключение оптимизации поиска файлов в include_path. Если поиск файлов выключен и будет найден закэшированный файл, используемый в include_path, файл не будет найден повторно. Таким образом, если файл с именем, попадающийся где-либо еще в include_path, он не будет найден. Включайте этот параметр только в случае, если это действительно принесет ожидаемый эффект ускорения. По умолчанию возможность отключена, т.е. оптимизация активирована. Значение по умолчанию «0».

 opcache.revalidate_path=0  

Если выключено, все комментарии PHPDoc будут удалены из кода с целью уменьшения размера оптимизированного кода. Отключение параметра может вызвать некорректную работу некоторых приложений или фреймворков (к примеру, Doctrine, ZF2, PHPUnit). Значение по умолчанию «1»

 opcache.save_comments=0  

Если выключено, комментарии PHPDoc не будут загружаться из общей памяти. При включении вывода, комментарии будут сохранятся, но выводиться приложениями только в случае надобности. Значение по умолчанию «1».

 opcache.load_comments=1  

Если включено, будет использоваться последовательность быстрых выключений для оптимизированного кода. Эта возможность не освобождает каждый используемый блок памяти, но позволяет работать Zend Engine Memory Manager. Значение по умолчанию «0».

 opcache.fast_shutdown=0  

При включении OPcache будет проверять наличие закешированного файла при вызовах file_exists(),is_file() и is_readable(). Это может увеличить скорость работы в приложениях, которые проверяют расширение и читабельность PHP-скриптов, но появляется риск вывода устаревших данных в случае отключения параметра opcache.validate_timestamps. Значение по умолчанию «0».

 opcache.enable_file_override=0  

Маска битности, в которой каждый бит включает или отключает в соответствующие проходы OPcache. Значение по умолчанию «0xffffffff».

 opcache.optimization_level=0xffffffff  

Включение этого хака в качестве рабочего окружения при ошибках вида «can't redeclare class». По умолчанию возможность отключена, т.е. оптимизация активирована. В php-5.3 и выше этот хак более не требуется и изменение параметра ни коим образом не скажется на работе. Значение по умолчанию «1».

 opcache.inherited_hack=1  

Включайте этот параметр только при появлении ошибок вида «Cannot redeclare class». значение по умолчанию «0».

 opcache.dups_fix=0  

Месторасположение списка файлов, к которым запрещен доступ для OPcache (поддерживаются маски). Каждый такой файл является текстовым файлом, в котором хранятся имена файлов, которые не требуется кэшировать.Формат файла предусматривает размещение каждого имени файла в отдельной строке. Имя файла может содержать полный путь, либо префикс (к примеру /var/www/x укажет на все файлы в директориях, начинающихся на ‘x’.

 opcache.blacklist_filename  

Строки, начинающиеся с “;” игнорируются (комментарии). Обычно, блокируют файлы следующих типов:

  1. Директории, в которых содержатся автоматически генерирующиеся файлы с кодом (к примеру кэш Smarty или ZFW фреймворков).
  2. Код, который не работает при кэшировании/оптимизации.
  3. Код, который не отображается по причине ошибок в OPcache.

Позволяет исключать большие файлы из кэширования. По умолчанию кэшируются все файлы. Значение по умолчанию «0».

 opcache.max_file_size=0  

Проверять контрольную сумму кэша каждое N-ое количество запросов. По умолчанию параметр имеет значение равное нулю, что означает отключение проверки. Подсчет контрольной суммы снижает производительность, этот параметр следует включать только если требуется отладка. Значение по умолчанию «0».

 opcache.consistency_checks=0  

Какое время ожидать (а секундах) перед запланированной перезагрузкой в случае недоступности кэша. OPcache использует этот параметр для определения ситуации появления возможных проблем. После истечение срока ожидания OPcache перезапускает процессы, которые были все это время заблокированы. Если уровень журналирования выставлен “3” (параметр opcache.log_verbosity_level) или выше, то в логи веб-сервера будет произведена запись “killed locker”. Значение по умолчанию «180».

 opcache.force_restart_timeout=180  

Определение названия и местоположения лога ошибок OPcache. При пустом значении ошибки выводятся в консоль.

 opcache.error_log  

Все ошибки OPcache отправлять в лог-файл лог-файл веб-сервера. По умолчанию, журналируются только критические ошибки (level 0) или обычные ошибки (level 1). Так же можно включить выводит предупреждений (level 2), информационных сообщений (level 3) или отладочную информацию (level 4). Значение по умолчанию «1».

 opcache.log_verbosity_level=1  

Предпочитаемый бэк-энд общей памяти. Можно оставить пустым и позволить системе самой разобраться.

 opcache.preferred_memory_model  

Защите общей памяти от несанкционированной записи во время выполнения скрипта. Полезно только для отладки. Значение по умолчанию «0».

 opcache.protect_memory=0  

Разрешение вызова API-функций OPcache из PHP-скриптов, путь к которым начинается тем, что указано в строке. По умолчанию пустое значение означает запрет на всё. Значение по умолчанию «»

 opcache.restrict_api  

Маппирование основных сегментов памяти (только для Windows). Все процессы PHP маппируются в общей памяти в некотором адресном пространстве. Этот параметр позволяет вручную исправить ошибки вида «Unable to reattach to base address».

 opcache.mmap_base 
Смотрите так же:


Помог ли вам данный ответ?

Добавить в избранное Добавить в избранное    Распечатать статью Распечатать статью

Также читают
Установка Ioncube (просмотров: 827)
Оптимизация PHP. Часть 2 (просмотров: 947)

Powered by WHMCompleteSolution