Kohana, Заметки → Тюнинг kohana 3.0

Не так давно я представил набросок простейшего фреймворка, предназначеного для изучения новичками и для создания простейших сайтов. Комментарий, оставленный к тому посту уважаемым мною Иваном Броткиным, заинтриговал. Стало очень интересно, чего же можно добиться, если поднастроить ko3 на скорость работы. Интерес чисто академический, поэтому и настройки, по ходу дела, будут такие же. Единственное условие, которое я поставил для себя: фреймворк должен остаться полностью работоспособным, без ограничений!

Итак, начнем. Для начала, отключаем все, что можно: кеш, логирование, все доп.модули. Вывод из контролера в браузер делаем через echo, чтобы избежать использование доп. кода в самой кохане. Смотрим результат:

time: 0.0273728370667;
memory: 749360

Совсем-совсем не плохо, если сравнивать с ko3.2 и дефолтными настройками (напомню: time: 0.0946259498596; memory: 1330864). Но, данные параметры все-равно довольно высоки, поэтому идем дальше.

Для начала, вспоминаем схему работы коханы и последовательность загрузки файлов. Попутно, пытаюсь вспомнить, что именно используется в core. В результате, перенес в application/classes файлы arr.php, controller.php, request.php, route.php. Все из system/classes/kohana. Соответственно, убрал из названия файлов Kohana_. Переносить core.php смысла не имеет, это будет видно чуть ниже. Смотрим результат:

0.0178439617157;
memory: 731848

Лучше, но не сильно. Изучаем дальше. В этот момент я вспомнил, что не отключил еще один момент в bootstrap.php. Честно говоря, до сих пор сомневаюсь, что его надо отключать, но раз уж цель полностью оптимизировать загрузку фреймворка — буду отключать. Этот «момент» называется config. Комментируем строку Kohana::$config->attach и смотрим, что получилось:

time: 0.0163331031799;
memory: 696248

Помогло, но не сильно. Снова изучаем код фреймворка… Начинаем, соответственно, с точки входа — index.php. После быстрого изучения файла понимаю, что в нем есть несколько ненужных строк:

if (file_exists('install'.EXT))
{
	// Load the installation check
	return include 'install'.EXT;
}

Т.к. мы уже протестили установку коханы — нет смысла при каждом запуске делать это снова, верно? Комментируем.

if (is_file(APPPATH.'classes/kohana'.EXT))
{
	// Application extends the core
	require APPPATH.'classes/kohana'.EXT;
}
else
{
	// Load empty core extension
	require SYSPATH.'classes/kohana'.EXT;
}

А вот тут все намного интереснее. При каждом запуске происходит проверка, существует ли файл application/classes/kohana.php. Если да — подключаем, если нет — подключаем из директории system. Комментируем этот блок, копируем файл system/classes/kohana.php в application/classes и вставляем в index.php:

require APPPATH.'classes/kohana'.EXT;

Вообще, это не очень хорошо, но у нас же чисто академический интерес, верно? 😉 Проверяем результат:

time: 0.0158510932922;
memory: 696248

Странно, но мы ничего и не выиграли от этих операций. Ну да ладно, лишним все-равно не будет. Кстати, если не заметили, именно в index.php происходит подключение system/classes/kohana/core.php. Именно по этой причине и нет смысла в переносе данного файла в application.

Т.к. я перенес в application основные файлы, необходимые для загрузки, логично попробовать отключить все остальные файлы и проверить, действительно ли хватает нескольких файлов для запуска фреймворка. Переименовываю system/kohana в system/_kohana (не забыв в index.php поменять путь для SYSPATH.’classes/kohana/core’.EXT). Запускаю и выпадаю в осадок…

Kohana говорит, что не может найти модуль логирования (Kohana_Log). Но ведь я закомментировал подключение логов в bootstrap! Однако, не верить кохане нельзя, поэтому лезу в core.php в строку 364:

// Load the logger
Kohana::$log = Kohana_Log::instance();

// Load the config
Kohana::$config = Kohana_Config::instance();

Мдя… Вроде и не используем эти модули, но они нужны. Ок, подсовываем данные классы в application/classes/kohana (log.php и config.php). После этого фреймворк запустился, значит это тот минимум, без которого работать не будет вообще ничего.

Далее… Собственно все )). Серьезно. Я провел еще пару часов на попытки ускорить работу, но толком ничего не добился (сможете помочь — дайте знать!). Максимум, чего я смог добиться (да и то, считаю что это погрешности):

time: 0.0151529312134;
memory: 691480

Конечно-же, это совсем не плохо для ko3.0, но очень далеко до простейшего микро-фреймворка, собранного «на коленке». Фреймворки, конечно-же, не созданы для идеальной скорости, их стезя — удобство разработки. Но, как показала практика, их можно (и нужно!) ускорять.