Kohana 3 merging patch 0.2

Просмотров: 27917Комментарии: 8
Web frameworks

Апдэйт патча, который сливает использованные классы Kohana 3 в один файл и тем самым ускоряет загрузку, даже со включенным акселератором.

Что нового:

  • добавлена возможность кэширования классов в соответствии с роутами. При первой загрузке создается т.н. кэш-загрузчик (preloader), который включает несколько классов, после инклуда которых становится возможным вызвать Request::instance(). Загрузчик общий для всех роутов. Последующие же классы, более специфичные для роутов, могут быть сохранены в соответствующих файлах кэша. А могут и не быть -- если отключить соответствующую настройку, будет создаваться один большой универсальный файл кэша.
  • более удобное задание настроек кэширования
  • сброс кэша закачкой или созданием в каталоге файла со специальным названием
  • рефакторинг кода

При разработке пришлось столкнуться с проблемой конкурирующей записи в кэш разными процессами одних и тех же классов. Естественно, при последующем инклуде система вылетает, жалуясь на переобъявление класса. Наиболее простой подход -- заключить каждый сливаемый класс в if (class_exists()) -- выглядит некрасиво, да и тогда уж надо проверять и на интерфейсность interface_exists(), что усложняет код. Поэтому пошел по пути лока файла кэша, хотя фишка поддерживается только относительно новыми файловыми системами, в *nix носит рекомендательный характер, а в некоторых системах и вовсе его работа не гарантируется. Тем не менее, пока сделал так. Тестировал на XAMPP (Windows, NTFS) и CentOS 5.3 (ext3, правда, с nginx в качестве front-end к апачу).

Установка простая -- достаточно скопировать патч в kohana_dir/application/classes. Исчерпывающие инструкции в комментарии к патчу. Кэш может работать только при включенном внутреннем кэшировании Коханы (вообще-то по движку этого нигде не требуется, но ИМХО так логичнее).

+++++++


In English:

Update for my Kohana 3 classes merging patch (that merges all needed classes in one big file to reduce number of includes). Changelog:

  • route-based cache added: at first application loading a "preloader" merged cache is being created. This preloader contains some basic Kohana classes that allow after their including to invoke Request::instance() to find a route. Other , more route-specific classes can be merged into different files, e.g. welcome.index.php, welcome.page.php etc. But if you want, you can dump all needed classes in that big-big-big preloader, and it will be loaded at every application request. 
  • handy settings set
  • merge cache invalidation by uploading or creating a file with specified name
  • code refactoring

During development I met a trouble with concurrent php processes writing to merged cache file. The simplest way to fix it is embrace all appended classes to if(class_exists()). But this solution looks not very beautiful, so I decided to lock merged file while writing by php flock(). Yes, it is a very specific function that is not guaranted to work at older filesystems and some modern FS. But for me it is preferable way. Stuff was tested on XAMPP (Windows, NTFS) and CentOS 5.3 (ext3, with nginx as front-end to apache).


Installation process is simple -- copy unzipped file into your kohana_path/application/classes dir. All instructions included into patch class comment. Merged cache can work only if internal Kohana 3 cache is on .No specific needs for that, but I think it is logical way.


Скачать / Download 78 (zipped ~5 KiB)

Буду рад критике. Feedback will be appreciated.

Комментариев: 8 RSS

2 Александр Купреев 09-08-2010 14:08

хотел, но сорвалось. так что пока нет

3 Chodex 09-08-2010 23:46

Хорошо потестирую сначала на своем проекте, нужна максимально экстремальная производительность) Отпишусь о результатах

4 Александр Купреев 10-08-2010 19:42

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

5 Chodex 11-08-2010 01:28

Все остальное уже имеется) Спасибо

6 lurker 10-11-2011 19:36

В Kohana 3.2 не работает. Только начал разбираться с этим фреймворком, помогите плиз.

Fatal error: Class 'Kohana_Log' not found in Y:\home\kohana\www\system\classes\log.php on line 3

8 Александр Купреев 10-11-2011 21:03

Под 3.2 не тестировалось, там серьезные изменения АПИ, работать скорее всего и не будет без модификации. Увы, времени на это счас нет :(

Оставьте комментарий!


Используйте нормальные имена.

     

  

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

MaxSiteAuth. Войти через loginza

(обязательно)