Kohana, Заметки > Роуты в kohana 3.2/3.3

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

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

Route::set('redirect', function($uri){
	$compiled = Route::compile('r/<key>', array('key'=>'\w+'));
	if (!preg_match($compiled, $uri, $matches))
	{
		return FALSE;
	}
	
	$url = @base64_decode($matches['key']);
	if (empty($url))
	{
		return FALSE;
	}
	
	return array(
		'controller'  => 'link',
		'action'      => 'index',
		'key'         => $matches['key'],
	);
}, 'r/<key>');

Роуты в kohana 3.2/3.3 >

Заметки > О блоге

gruz0 попросил немного рассказать, что и как в этом блоге. Начну с установленных плагинов:

  1. .html on PAGES — плагин добавляет .html в url каждой страницы. Честно — не помню, когда и почему его поставил, но мне всегда нравилось, что ссылка заканчивается расширением, получается какая-то законченность ссылки.
  2. All in One SEO Pack — тут наверное никому, кто так или иначе сталкивался с wordpress, объяснять не нужно. Автоматом проставляем keywords и description в мета-теги страницы.
  3. Cyr to Lat enhanced — не люблю ссылки на русском языке :).
  4. Disqus Comment System — я давным-давно отказался от обычных комментариев в блоге. Причин много, но основная — спам. Disqus помогает избавиться от автоматического спама, да и для пользователей относительно удобен. Правда, в последнее время подумываю про hypercomments.
  5. Executable PHP widget — виджет с возможностью использования php-кода. Удобен и прост.
  6. Google XML Sitemaps — не вижу необходимости в объяснении, что это за плагин :).
  7. Quotes Collection — виджет с цитатами. Ставил для пробы, да так он и остался.
  8. SyntaxHighlighter Evolved и SyntaxHighlighter Evolved: PHP5 — подсветка кода в постах. Второй добавляет поддержку php 5.*.
  9. WP No Category Base — один из самых полезных, для меня, плагинов. Он упрощает ссылки вида http://aktuba.com/category/notes до http://aktuba.com/notes. Согласитесь, второй вариант значительнее приятнее на глаз ;).
  10. WP Super Cache — плагин, который заставляет блог работать, после плагинов выше:). Генерация главной страницы этого блога отжирает (по другому и не скажешь) 28.7Мб памяти сервера. Это просто жесть и без кеширования не обойтись (((

Вот и все плагины, которые я использую. Кроме того, настроен Last-Modified и обработка Not Modified, что позволяет страницам значительно быстрее открываться при повторном заходе. Проверить, настроены ли эти заголовки можно на этом ресурсе, кстати. Ну и включен gzip на сервере, т.к. мощности серверов давным-давно позволяют не замечать нагрузки от сжатия выходных данных. Включайте у себя gzip!

Чуть не забыл — еще используются два «вкрапления» (в терминах wordpress). Оба они подменяют функционал wordpress на свой: advanced-cache.php и object-cache.php. Уверен, что работает только один из них, но какой и как — понятия не имею :). Надо будет как-нибудь посмотреть что у них внутри и как они работают…

О блоге >

Заметки, Проекты > Mobile Detector

Понадобилось мне для тестов определять, с мобильного ли устройства зашел пользователь. Набросал простейший класс для себя, а потом (странно, что потом :)) решил посмотреть готовые решения.

Честно, удивился. Большинство использует (или рекомендует использовать) детектор Яндекса. Кто-то юзает монстров, а кто-то вообще подобное покупает!

Для меня реально остается загадкой, как можно додуматься при каждом запросе клиента делать запрос по апи к яндексу. Я понимаю, что запросы простые и быстрые, но ведь еще есть накладные расходы на сам запрос.

Так же не понимаю, КТО покупает подобные скрипты. Если покупатель не программер — тебе скрипт не нужен, проще нанять программера. Если-же покупатель программер, то как он мог додуматься купить скрипт, а не сделать самому или хотя бы не поискать???

Заметки, Проекты > NoNaMe Todo List 1.5a

УРА! Нашел в бекапе одну из своих старых программ. Как-же приятно видеть, что я когда-то, давным-давно, подобное сделал! Вот теперь бы подобное в вебе реализовать — было бы классно. Нет js-спецов, желающих помочь?

Заметки, Проекты > Настоящий микрофреймворк!

Саша в твиттере подкинул интересную ссылку: новую парадигму создания микро-фреймворков, а именно — массиво-ориентированную парадигму (array-oriented programming). Кому лень идти по ссылке, вот пример реализации:

$app = array(
	'session' => array(),
	'request' => array(
		'method' => 'GET',
		'uri' => '',
		'data' => array()
	),
	
	'response' => array(
		'body' => '',
		'headers' => array()
	),
	
	'errors' => array(
		404 => function(&$request, &$response) {
			$response['body'] = '404 Not Found';
			$response['headers'][] = 'Status: 404';
		}
	),
	
	'routes' => array(
		'/' => function(&$request, &$response) {
			$response['body'] = 'GET /';
		},
		
		'/test' => function(&$request, &$response) {
			$response['body'] = 'GET /test';
		}
	),
	
	'route' => null,
	
	'bootstrap' => array(
		'request' => function(&$app) {
			if ($_SERVER['REQUEST_METHOD'] == 'POST') {
				$app['request']['is_post'] = true;
			}
			$app['request']['uri'] = '/' . trim($_SERVER['REQUEST_URI'], '/');
			$app['request']['method'] = strtoupper($_SERVER['REQUEST_METHOD']);
			$app['request']['data'] = $_REQUEST;
		},
		
		'router' => function(&$app) {
			$route = $app['request']['uri'];
			if (!isset($app['routes'][$route])) {
				$app['route'] = $app['errors'][404];
				return;
			}
			$app['route'] = $app['routes'][$route];
		}
	),
	
	'dispatch' => function(&$app) {
		$route = $app['route'];
		$route($app['request'], $app['response']);
	}
);

foreach ($app['bootstrap'] as $bootstrap) {
    $bootstrap($app);
}
$app['dispatch']($app);

foreach ($app['response']['headers'] as $header) {
    header($header);
}
if ($app['response']['body'] !== null) {
    echo $app['response']['body'];
}

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

time: 0.000189065933228 ms;
memory: 4216 b

Как вам в сравнении с ko3, например? )