Различия
Показаны различия между двумя версиями страницы.
каталог_статей:веб-окружение:оптимизация_php [2015/08/27 12:14] |
каталог_статей:веб-окружение:оптимизация_php [2022/04/01 15:08] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Оптимизация php ====== | ||
+ | Применимость: | ||
+ | Слова для поиска: | ||
+ | |||
+ | ---- | ||
+ | ===== Задача: | ||
+ | Увеличение производительности сайта. | ||
+ | ===== Решение: | ||
+ | Для увеличения производительности и скорости работы веб-приложения можно произвести оптимизацию PHP, который отвечает за динамическую составляющую сайта. | ||
+ | Для этого можно перевести интерпретатор PHP в один из 3 режимов работы: | ||
+ | - PHP как модуль Apache | ||
+ | - PHP как CGI, | ||
+ | - PHP как FastCGI | ||
+ | | ||
+ | ===== PHP как модуль Apache: ===== | ||
+ | В это режиме для запуска PHP используется модуль веб-сервера apache mod_php. | ||
+ | В данном режиме скрипты выполняются быстрее всего, так как сервер сам обрабатывает скрипты, | ||
+ | ===== PHP как CGI: ===== | ||
+ | В это режиме для запуска PHP используется модуль веб-сервера apache mod_cgi. Скрипты передаются посредством данного модуля на вход интерпретатора PHP. | ||
+ | В данном режиме скрипты имеют отдельный процесс и выполняются с правами пользователя – владельца www-домена, | ||
+ | ===== PHP как FastCGI: ===== | ||
+ | В это режиме для запуска PHP используется модуль веб-сервера apache mod_fastcgi. Скрипты передаются посредством данного модуля на вход интерпретатора PHP. Отличием от режима PHP как CGI является то, что для скрипта происходит кэширование некоторых промежуточных данных и нет необходимости интерпретировать его каждый раз перед выполнением, | ||
+ | ===== Что необходимо для оптимизации PHP ===== | ||
+ | Для повышения производительности PHP необходимо: | ||
+ | - Если имеется доступ к управлению программным обеспечением сервера, | ||
+ | - Установить один из предкомпиляторов PHP. | ||
+ | |||
+ | ===== Настройка предкомпиляторов PHP: ===== | ||
+ | PHP - движок, | ||
+ | Кэширование кода операции: | ||
+ | Когда запрашивается скрипт PHP, PHP читает скрипт и собирает его в то, что называется код операции Zend, бинарное представление кода, который будет выполнен. Этот код операции затем выполняется движком PHP и теряется. Кэширование кода операции сохраняет его и в следующий раз при запросе страницы вновь использует, | ||
+ | Акселератор PHP — расширение для PHP, основное назначение которого - увеличение производительности интерпретатора при обработке сценариев путем кэширования их байт-кода. | ||
+ | Как выглядит обработка сценария на PHP обычным интерпретатором: | ||
+ | - Чтение файла. | ||
+ | - Генерация байт кода. | ||
+ | - Выполнение кода. | ||
+ | - Выдача результата. | ||
+ | Дело в том, что при выполнении стандартного обращения к PHP скрипту, | ||
+ | Как выглядит обработка сценария на PHP с использованием кэширования: | ||
+ | - Чтение файла. | ||
+ | - Проверка, | ||
+ | - Если есть, отдается кэшированный контент. | ||
+ | - Если нет, то создается кэш и выдается его содержимое. | ||
+ | |||
+ | ===== Существующие решения ===== | ||
+ | * **APC** — хранение данных передается APC, при этом данные хранятся в памяти; | ||
+ | * **XCache** — хранение данных передается XCache, при этом данные хранятся в памяти; | ||
+ | * **eAccelerator** — хранение данных передается eAccelerator, | ||
+ | * **Memcached** – оперативная в оперативной памяти. | ||
+ | APC XCache eAccelerator: | ||
+ | Недостаток 1: использует общую для скриптов и кэша память.\\ | ||
+ | Недостаток 2: при кэшировании требуется сериализация данных. | ||
+ | |||
+ | ===== Alternative PHP Cache (APC) ===== | ||
+ | The Alternative PHP Cache — бесплатный и открытый opcode кэшер для PHP. Он был задуман, | ||
+ | Проект живет и развивается. Поддерживает PHP4 и PHP5, включая 5.3 и 5.4. | ||
+ | Это расширение PECL не поставляется вместе с PHP. | ||
+ | После установки акселератора APC, схема выполнения запроса будет следующей: | ||
+ | Применение APC для PHP: | ||
+ | {{ : | ||
+ | |||
+ | ===== Установка APC ===== | ||
+ | |||
+ | Для начала надо установить необходимые пакеты: | ||
+ | < | ||
+ | |||
+ | Затем установить APC при помощи pecl: | ||
+ | |||
+ | < | ||
+ | |||
+ | Отредактировать конфигурационный файл: | ||
+ | |||
+ | < | ||
+ | |||
+ | Добавить в него следующую строку: | ||
+ | |||
+ | < | ||
+ | apc.shm_size = 64 Количество выделяемой оперативной памяти в МБ. | ||
+ | apc.enabled=1 APC включен. Довольно очевидная настройка, | ||
+ | Отключение APC может привести к уменьшению производительности на рабочем сервере.</ | ||
+ | < | ||
+ | apc.shm_size=32</ | ||
+ | |||
+ | Эти настройки показывают сколько памяти выделять под APC. APC.shm_segments=1 - показывает что выделяется один сегмент памяти, | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | |||
+ | apc.stat=1</ | ||
+ | Этот параметр напрямую влияет на производительность. При включенной настройке кэш в APC остается там пока не будет удален. В случае когда настройка отключена, | ||
+ | |||
+ | < | ||
+ | |||
+ | Эта настройка показывает через сколько миллисекунд очистить кэш. При 0 кэш не очищается. Поэтому мы ставим 0, мы же не хотим чтобы каждый час нужный нам кэш очищался (по умолчанию 7200, то есть 2 часа). | ||
+ | |||
+ | < | ||
+ | |||
+ | Эта настройка может быть очень нужна, когда на сервере несколько сайтов, | ||
+ | Для вступления настроек в силу необходимо перезапустить веб-сервер. | ||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =====Zend OPcache ===== | ||
+ | Zend OPcache — это предкомпилятор PHP кода, разработкой которого занимается команда PHP. Начиная с PHP версии 5.5 он включен в основной пакет расширений PHP, на для более ранних версий его нужно устанавливать отдельно. | ||
+ | Установка: | ||
+ | |||
+ | Для установки в PHP 5.5 - 5.6, требуется отредактировать php.ini для вашего сайта, например: | ||
+ | < | ||
+ | |||
+ | Найти позицию zend_extension и указать путь к opcache.so и указать минимальные параметры, | ||
+ | |||
+ | <code | Пример конфигурации:> | ||
+ | zend_extension=/ | ||
+ | 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 </ | ||
+ | |||
+ | После выполненных действий перезапустить веб-сервер: | ||
+ | |||
+ | < | ||
+ | / | ||
+ | |||
+ | <code | Рекомендованные минимальные параметры:> | ||
+ | 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 для CLI-версии PHP. Наилучшим образом подходит для тестирование и отладки. Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | Размер используемой памяти для хранения | ||
+ | Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | Количество памяти для пула строк в мегабайтах. Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | Максимальное количество ключей (скриптов) в хэш-таблице OPcache. Число должно быть простым и быть больше, | ||
+ | < | ||
+ | |||
+ | Максимальный процент “замусоренной” памяти для запланированного перезапуска. Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | При включении этого параметра, | ||
+ | < | ||
+ | |||
+ | При отключенном параметре, | ||
+ | < | ||
+ | |||
+ | Через какой промежуток времени (в секундах) проверять изменения временных меток для поддержания данных в памяти в актуальном состоянии. (“1” означает проверку с периодичностью раз в секунду для запроса, | ||
+ | < | ||
+ | |||
+ | Предотвращает кэширование файлов, | ||
+ | < | ||
+ | |||
+ | Включение или отключение оптимизации поиска файлов в include_path. Если поиск файлов выключен и будет найден закэшированный файл, используемый в include_path, | ||
+ | < | ||
+ | |||
+ | Если выключено, | ||
+ | < | ||
+ | |||
+ | Если выключено, | ||
+ | < | ||
+ | |||
+ | Если включено, | ||
+ | < | ||
+ | |||
+ | При включении OPcache будет проверять наличие закешированного файла при вызовах file_exists(), | ||
+ | < | ||
+ | |||
+ | Маска битности, | ||
+ | < | ||
+ | |||
+ | Включение этого хака в качестве рабочего окружения при ошибках вида " | ||
+ | По умолчанию возможность отключена, | ||
+ | < | ||
+ | |||
+ | Включайте этот параметр только при появлении ошибок вида " | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Месторасположение списка файлов, | ||
+ | < | ||
+ | |||
+ | Строки, | ||
+ | - Директории, | ||
+ | - Код, который не работает при кэшировании/ | ||
+ | - Код, который не отображается по причине ошибок в OPcache. | ||
+ | |||
+ | Позволяет исключать большие файлы из кэширования. По умолчанию кэшируются все файлы. Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | Проверять контрольную сумму кэша каждое N-ое количество запросов. По умолчанию параметр имеет значение равное нулю, что означает отключение проверки. Подсчет контрольной суммы снижает производительность, | ||
+ | < | ||
+ | |||
+ | Какое время ожидать (а секундах) перед запланированной перезагрузкой в случае недоступности кэша. | ||
+ | OPcache использует этот параметр для определения ситуации появления возможных проблем. После истечение срока ожидания OPcache перезапускает процессы, | ||
+ | < | ||
+ | |||
+ | Определение названия и местоположения лога ошибок OPcache. При пустом значении ошибки выводятся в консоль. | ||
+ | < | ||
+ | |||
+ | Все ошибки OPcache отправлять в лог-файл лог-файл веб-сервера. По умолчанию, | ||
+ | < | ||
+ | |||
+ | Предпочитаемый бэк-энд общей памяти. Можно оставить пустым и позволить системе самой разобраться. | ||
+ | < | ||
+ | |||
+ | Защите общей памяти от несанкционированной записи во время выполнения скрипта. Полезно только для отладки. Значение по умолчанию " | ||
+ | < | ||
+ | |||
+ | Разрешение вызова API-функций OPcache из PHP-скриптов, | ||
+ | < | ||
+ | |||
+ | Маппирование основных сегментов памяти (только для Windows). Все процессы PHP маппируются в общей памяти в некотором адресном пространстве. Этот параметр позволяет вручную исправить ошибки вида " | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== eAccelerator ===== | ||
+ | |||
+ | eAccelerator - это свободный opensource-проект, | ||
+ | eAccelerator сохраняет скомпилированый PHP-код сначала в общей памяти, | ||
+ | Поддерживает PHP4 и PHP5, включая 5.3. | ||
+ | |||
+ | ===== Установка eAccelerator: | ||
+ | |||
+ | < | ||
+ | Загрузите архив с исходными кодами eAccelerator: | ||
+ | |||
+ | < | ||
+ | Распаковка архива: | ||
+ | < | ||
+ | #cd eaccelerator-0.9.5 </ | ||
+ | Далее необходимо запустить phpize для создания config-файлов, | ||
+ | < | ||
+ | # | ||
+ | #make | ||
+ | #make install | ||
+ | cp modules/ | ||
+ | Акселератор установлен. | ||
+ | |||
+ | Теперь необходимо отредактировать файл path-to-php.ini/ | ||
+ | |||
+ | < | ||
+ | extension=”eaccelerator.so” | ||
+ | eaccelerator.shm_size=”16″ | ||
+ | eaccelerator.cache_dir=”/ | ||
+ | eaccelerator.enable=”1″ | ||
+ | eaccelerator.optimizer=”1″ | ||
+ | eaccelerator.check_mtime=”1″ | ||
+ | eaccelerator.debug=”0″ | ||
+ | eaccelerator.filter=”” | ||
+ | eaccelerator.shm_max=”0″ | ||
+ | eaccelerator.shm_ttl=”0″ | ||
+ | eaccelerator.shm_prune_period=”0″ | ||
+ | eaccelerator.shm_only=”0″ | ||
+ | eaccelerator.compress=”1″ | ||
+ | eaccelerator.compress_level=”9″ | ||
+ | </ | ||
+ | <code | Максимальный размер кэша в мегабайтах:> | ||
+ | <code | Корневой каталог для хранения кэша:> | ||
+ | <code | Включение акселератора:> | ||
+ | <code | Подключить или отключить встроенный оптимайзер, | ||
+ | <code | Включает проверку модификации PHP файлов:> | ||
+ | <code | Режим отладки. Если поставить 1 или вообще забыть упомянуть этот параметр, | ||
+ | <code | Здесь можно определить можно определить, | ||
+ | <code | Максимально допустимое значение которое может быть отправлено в разделяемую память. По-умолчанию, | ||
+ | <code | Когда акселератору потребуется отправить в разделяемую память какой-то объект и при этом в памяти для этого не окажется места, он попытается удалить файлы, которые не были запрошены в течении последних " | ||
+ | <code | Когда акселератору потребуется отправить в разделяемую память какой-то объект и при этом в памяти для этого не окажется места, он попытается удалить старые скрипты, | ||
+ | <code | Включить или отключить кэширование скомпилированных скриптов _только_ на диск. Этот параметр не влияет на данные сессий и кэширование контента. По-умолчанию, | ||
+ | <code | Включить или отключить сжатие закэшированного контента. По-умолчанию, | ||
+ | <code | Уровень сжатия. По-умолчанию, | ||
+ | |||
+ | **Создание cache-директории.** Последний важный шаг в настройке акселератора - это создание директории для кэша, имя которой мы задавали в конфигурационном файле. Значение по умолчанию - / | ||
+ | |||
+ | Не очень хорошим решением будет оставлять права на запись для всех пользователей. Более безопасным будет сменить владельца директории eaccelerator на пользователя, | ||
+ | < | ||
+ | #mkdir / | ||
+ | #chown nobody: | ||
+ | #chmod 0644 / | ||
+ | |||
+ | Для вступления настроек в силу необходимо перезагрузить web-сервер. | ||
+ | < | ||
+ | На этом настройка eAccelerator закончена | ||
+ | Если при доступе к созданному файлу с кодом: | ||
+ | < | ||
+ | phpinfo(); | ||
+ | ?> </ | ||
+ | видно информацию о eAccelerator, | ||
+ | |||
+ | ===== Xcache ===== | ||
+ | |||
+ | Поддерживает функции оптимизации скриптов, | ||
+ | XCache решает большинство проблем, | ||
+ | Проект живет и развивается. Поддерживает PHP4 и PHP5, включая 5.5. | ||
+ | Xcache очень агрессивно кэширует байт-код php и после того как он был закэширован в памяти, | ||
+ | Его версии выходят чаще, а так же его обещают включить в стандартную поставку php6 | ||
+ | |||
+ | ===== Установка XCache ===== | ||
+ | Для установки необходимо выполнить: | ||
+ | < | ||
+ | Далее необходимо отредактировать файл / | ||
+ | < | ||
+ | |||
+ | После установки файл конфигурации в / | ||
+ | < | ||
+ | xcache.count = 14 | ||
+ | xcache.slots = 8K | ||
+ | xcache.ttl = 36000 | ||
+ | xcache.gc_interval = 36000 | ||
+ | xcache.var_size = 8M | ||
+ | xcache.var_count = 14 | ||
+ | xcache.var_slots = 8K | ||
+ | xcache.var_ttl = 36000 | ||
+ | xcache.var_maxttl = 604800 | ||
+ | xcache.cacher = On | ||
+ | xcache.stat = On </ | ||
+ | |||
+ | Основные параметры: | ||
+ | |||
+ | **xcache.siz**e - отвечает за количество памяти для хранения кэша. Если значение будет слишком маленьким, | ||
+ | |||
+ | **xcache.count** — количество блоков, | ||
+ | |||
+ | **xcache.slots** - Количество слотов под кэш, чем больше слотов, | ||
+ | |||
+ | **xcache.ttl** - Время жизни кэшированного объекта в секундах. Если к объекту никто не обращался в течении указанного времени, | ||
+ | |||
+ | **xcache.gc_interval** — интервал запуска сборщика мусора в секундах. Определяет промежуток времени, | ||
+ | |||
+ | После настроек необходимо перезапустить веб-сервер: | ||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Что такое Memcache и какое отношение он имеет к PHP? ===== | ||
+ | |||
+ | Memcache разработан для кэширования данных, | ||
+ | |||
+ | ===== Установка и настройка Memcache: ===== | ||
+ | |||
+ | Модуль Memcached для PHP доступен в репозитории уже скомпилированным (php5-memcached), | ||
+ | |||
+ | <code | Устанавливаем сервер Memcached:> | ||
+ | #apt-get install memcached </ | ||
+ | <code | Для начала, | ||
+ | #/ | ||
+ | <code | Memcached будет работать, | ||
+ | -d </ | ||
+ | <code | Путь для лога:> | ||
+ | logfile / | ||
+ | |||
+ | <code | Отведём 256 мегабайт ОЗУ под хранилище:> | ||
+ | -m 256 < | ||
+ | <code | Слушать будет этот порт:> | ||
+ | -p 11211 </ | ||
+ | <code | В последствии желательно поменять:> | ||
+ | -u nobody </ | ||
+ | <code | Слушаем localhost:> | ||
+ | -l 127.0.0.1 </ | ||
+ | |||
+ | <code | Перезапускаем memcache> | ||
+ | # max connection 2048 MAXCONN=" | ||
+ | |||
+ | <code | Далее проверяем, | ||
+ | # netstat -tap | grep memcached </ | ||
+ | <code | В случае успеха, | ||
+ | tcp 0 0 localhost: | ||
+ | |||
+ | <code | Компилируем и устанавливаем модуль для PHP:> | ||
+ | apt-get install php5-memcached | ||
+ | apt-get install php5-dev libmemcache-dev | ||
+ | pecl download memcache | ||
+ | tar xzvf memcache-2.2.6.tgz | ||
+ | cd memcache-2.2.6/ | ||
+ | phpize && ./configure --enable-memcache && make | ||
+ | cp modules/ | ||
+ | echo ' | ||
+ | / | ||
+ | |||
+ | При перезапуске memcached весь кэш теряется. | ||
+ | |||
+ | <code | Настройки memcached:> | ||
+ | STAT maxbytes 134217728 | ||
+ | STAT maxconns 1024 | ||
+ | STAT tcpport 11211 | ||
+ | STAT udpport 11211 | ||
+ | STAT inter 127.0.0.1 | ||
+ | STAT verbosity 0 | ||
+ | STAT oldest 0 | ||
+ | STAT evictions on | ||
+ | STAT domain_socket NULL | ||
+ | STAT umask 700 | ||
+ | STAT growth_factor 1.25 | ||
+ | STAT chunk_size 48 | ||
+ | STAT num_threads 4 | ||
+ | STAT stat_key_prefix : | ||
+ | STAT detail_enabled no | ||
+ | STAT reqs_per_event 20 | ||
+ | STAT cas_enabled yes | ||
+ | STAT tcp_backlog 1024 | ||
+ | STAT binding_protocol auto-negotiate | ||
+ | STAT auth_enabled_sasl no | ||
+ | STAT item_size_max 1048576 </ | ||
+ | |||
+ | |||
+ | ---- | ||
+ | Актуальность: | ||
+ | |||
+ | {{tag> Apache CGI FastCGI}} |