Ускорение PHP скриптов (для нуба)

Общеизвестный факт, что PHP это такое средство разработки домашних страниц, что совершенно исключает его применение для крупных проектов. Но с годами домашняя страничка выросла, а время на переписывание всего с нуля взять неоткуда. Пришлось изменить название языка и обвешиваться инфраструктурой, чтобы получить какой то компромисс в производительности.

Как все работает

Для тех, кто далек от программирования поясню. Браузер посетителя запрашивает у сервера страницу. Тот (пускай, Apache) находит файл на диске и обнаруживает, что он оканчивается на PHP. За этим следует вызов модуля PHP. А может даже и отдельной программы, если тот установлен как CGI. В обмен переданному файлу с программным кодом сервер получает HTML-код, который летит к пользователю.

Представьте, что посетителей несколько. А лучше даже 100 человек одновременно. И для каждого посетителя выполняются одни и те же действия. С одним и тем же результатом.

Догадливый читатель мог подумать, что если поставить перед сервером Apache что-то, что будет сохранять HTML-код и не дергать лишний раз PHP, то это похоже на решение. Например, прокси в лице Squid или хорошо настроенный Nginx (здесь можно обойтись и без Apache). Но в общем случае это подходит только, если ваш посетитель — читатель, а не писатель.

Мы приходим к тому, что никуда не деться от постоянного вызова PHP скрипта. Еще хуже, что это не просто скрипт, а CMS. В одном запросе участвует пара десятков PHP-скриптов различных библиотек, классов. А еще работал тут когда-то программист, который вместо встроенной в язык функций написал свою в 100 строк и одному сложному запросу предпочел два простых с обработкой данных на PHP. А еще комментарии составляют 30% от объема файла.

Пока вы это читали, интерпретатор PHP тысячу раз занимался тем, что перечитывал содержимое PHP-файла и удивлялся написанному там.

Но вообще, эта проблема решена давным давно. Лет так 10 назад. И я зря писал обо всем этом. Встречаем PHP-ускорители!

Обзор PHP-ускорителей

Все они устроены одинаково. Из цепочки выполнения запроса исключается та часть, где с диска берется PHP-файл и интерпретируется в машинный код (байткод — прим. dark_barker).

Технически это модуль для PHP. Так что важно, чтобы он поддерживал используемую вами версию PHP.

XCache (http://xcache.lighttpd.net/)
Разработан одним из тех людей, которые работают над сервером Lighttpd. Относительно новый. Вместе со стабильной первой веткой идет работа над второй версией.

eAccelerator (http://eaccelerator.net/)
Когда-то форк от бесплатного и заброшенного Turck MMCache. До начала 2007 умел кодировать исходники. А с недавнего релиза вместе с поддержкой PHP 5.3 разучился хранить сессии и работать с пользовательским кешем (об этом позже).

ionCube PHP Encoder (http://www.ioncube.com/)
Одно из первых решений с акцентом на кодирование исходников. В какое-то время остановился в развитии, а позже осталась только коммерческая версия. Остается на плаву, но дальнейшая судьба не ясна.

Windows Cache Extension (http://www.iis.net/expand/WinCacheForPHP)
Возможно, что единственное решение для IIS-сервера. Поддержка PHP 5.3, копирайт Майкрософта.

Alternative PHP Cache (APC) (http://pecl.php.net/package/APC)
Находится в официальном хранилище расширений и легко устанавливается. Оперативно обновляется. Будет включен в PHP 6, так что надеюсь скоро эта статья потеряет свою актуальность.

Zend Optimizer+ (http://www.zend.com/en/products/server-ce/index)
Распространяется в составе Zend Server.

NuSphere PHPExpress (http://www.nusphere.com/products/phpexpress.htm)
Еще один ускоритель (спасибо morkovnik). Но главная фишка в том, что он работает с файлами закодированными их же платным Nu-Coder-ом для дальнейшего коммерческого распространения. Только вот сами их представители не могут назвать ни одного Shared-хостинга, где бы использовался PHPExpress. Кроме основной функции ничего не умеет. Поддержка PHP 5.3 обещана в начале 2010 (сообщение на их форуме). Распространяется в скомпилированном состоянии в виде расширений для 4.3, 4.4, 5.0, 5.1., 5.2.

Замеры скорости

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

Также обычно настраивается место хранения кода (память или диск) и его объем.

Делаем окончательный выбор

Я мельком упомянул работу с пользовательским кэшем. Это общее временное key/value-хранилище в памяти. Оно естественно быстрее, чем Memcache, так как исключает задержки сетевого протокола. Но ограничено одной физической машиной, на которой исполняется скрипт.

Поддержка этой функциональности есть во всех актуальных модулях: в APC, XCache и Zend Server (в лице Data Cache), а в eAccelerator она по-умолчанию выключена.

Выбор из этих четырех — дело личных предпочтений.
  • +3
  • 9 февраля 2010, 04:03
  • akhmetov

Комментарии (25)

RSS свернуть / развернуть
+
+1
Прикольная тема, кроме Zend Optimizer ничего не использовал конечно, но получается некий аналог mod_perl как я вижу, только без разделения «глобальных» данных.

Оптимизация это хорошо, недавно мерял Apache::DBI позволяющий один раз подключиться к базе mod_perl скриптам и работать всем с этим соединением, против mysql_pconnect, странно но у меня ускорение первого было больше почти в 4 раза… мерял через ab -n 1000 -c 10
avatar

MpaK

  • 9 февраля 2010, 10:17
+
0
Zend Optimizer (http://www.zend.com/en/products/guard/zend-optimizer), который для кодированных скриптов — это не тот что с плюсиком на конце из обзора. У них путаница в названиях.

Zend Optimizer is a free runtime application that enables PHP to run the scripts encoded by Zend Guard.

If you're looking for better PHP application performance, we strongly recommend you download Zend Server, which includes Zend Optimizer+ for opcode acceleration.
avatar

akhmetov

  • 9 февраля 2010, 15:40
+
+1
мда, забавно ^))) я что-то кодил Zend Safeguard'ом… тыренным, чтобы не стырили :)))
avatar

MpaK

  • 9 февраля 2010, 16:00
+
+1
забыли еще про PhpExpress
по функционалу похож на Zend
avatar

morkovnik

  • 12 февраля 2010, 21:42
+
0
Они какие-то неуверенные. PHP 5.3 все еще не поддерживали. Ну, и фокус на коммерческой системе кодирования файлов. Бросил взгляд и не стал добавлять его в обзор. В списке на википедии (ссылка ниже) он есть, да.
avatar

akhmetov

  • 12 февраля 2010, 21:51
+
+2
секунду, он может как на лету кешировать (делать опкод), так и работать с заранее закодированными файлами! это 2 разные песни…

на сколько мне известно php 5.3 все еще сырой и в нем есть серьезные внутренние ошибки. не стоит торопится без повода.

в попробовать можете сами http://www.nusphere.ru/catalog/server/nusphere_phpexpress/
avatar

morkovnik

  • 12 февраля 2010, 21:56
+
0
Понятно что две разных, но заработок идет с продажи системы кодирования, а это лишь необходимый компонент. Уверен, как только Nu-Coder научится PHP 5.3, то и PHPExpress новый подоспеет. В отличие от остальных.
avatar

akhmetov

  • 12 февраля 2010, 22:07
+
+2
не понимаю, вас интересует программный продукт и его возможности или как компания которая его делает ищет средства на разработку? моделей приема денег масса. увы, без денег ничего не делается…
avatar

morkovnik

  • 12 февраля 2010, 22:10
+
+1
Добавил в обзор.
avatar

akhmetov

  • 12 февраля 2010, 22:37
+
-1
Можете минусовать :)
avatar

akhmetov

  • 12 февраля 2010, 22:07
+
+1
По APC хорошая документация на php.net: http://ru.php.net/manual/en/apc.setup.php
avatar

akhmetov

  • 9 февраля 2010, 15:43
+
+1
ставил я как-то еAccelerator, бенчить не стал, руки не дошли, так как нужды не было… наверное меня больше сейчас оптимизация скорости баз данных интересует, кэширование и т.п.
avatar

MpaK

  • 9 февраля 2010, 16:01
+
0
Ну на продакшене всяко надо ставить ускоритель. Прирост в разы.
А про базу данных я еще напишу :)
avatar

akhmetov

  • 9 февраля 2010, 16:11
+
+1
интерпретируется в машинный код
Серьёзно? :)

Между машинным кодом и байткодом огромная разница, особенно в контексте этой статьи)
avatar

dark_barker

  • 9 февраля 2010, 16:38
+
0
Если я не могу прочесть что написано в том файле, значит машинный)) Не надо цепляться за слова) Направление то такое )
avatar

akhmetov

  • 9 февраля 2010, 16:44
+
+1
А… ну раз не можешь прочесть, тогда всё логично)

А если серьёзно, то разница большая в том, что Java-приложения, например, изначально проходят больше этапов перед выполнением, то есть распросраняются как байткод, а выполняются как скомпилированные в машинный код. То есть тут «кешировать байткод» — бессмысленное выражение. И, разумеется, байткод выполняется медленнее в данном случае, неспроста он далее в машинный код компилируется. То есть я к тому, что если бы php вдруг компилировался в машинный код, то смысла в статье не было бы)

А так — да, может и придираюсь)
avatar

dark_barker

  • 9 февраля 2010, 18:04
+
+2
Ну в чем-то ты прав, скорее всего акселераторы кэшируют в опкод для своей виртуальной машины Zend.
avatar

MpaK

  • 9 февраля 2010, 19:45
+
0
Да-да, прав он. Не важно что именно они кешируют, а важно что кешируют вообще.
avatar

akhmetov

  • 9 февраля 2010, 20:21
+
+1
Интересно как это только влияет на память, наверное поедает не кисло раз приходиться держать там всё это богатство, не пробовал как-то замерять при нагрузках?
avatar

MpaK

  • 10 февраля 2010, 14:01
+
0
Комментарием ниже eye-ru привел ссылки.
avatar

akhmetov

  • 10 февраля 2010, 17:02
+
+1
а память? что с памятью твориться?
avatar

MpaK

  • 10 февраля 2010, 17:13
+
0
Там есть настройка — хранить на диске, в памяти и на диске, в памяти. И объем соответственно тоже можно указать.
avatar

akhmetov

  • 10 февраля 2010, 17:21
+
+1
Понятненько, в целом прирост по скорости видно значительный
avatar

MpaK

  • 10 февраля 2010, 17:29
+
+1
Если вдруг кому то будут интересны бенчмарки то — раз (таблица результатов) и два.
Списочег всех ускорителей.
avatar

eye-ru

  • 10 февраля 2010, 14:44
+
0
Спасибо за дополнение. Первый тест старый все таки и могло многое измениться, а второй демонстрирует примерно одинаковое трехкратное ускорение независимо от выбора.
Еще есть сравнительный тест систем кеширования: http://club.shelek.ru/viewart.php?id=300
avatar

akhmetov

  • 10 февраля 2010, 17:01

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.