Отправляет email-рассылки с помощью сервиса Sendsay

Пишем фреймворк на PHP

  Все выпуски  

Пишем фреймворк на PHP Начало


Итак, что мы делаем.

Пишем свой фреймворк. Многие могут возразить, что уже создано достаточное количество различных фреймворков, которые успешно разиваются и используются, и что нет необходимости заново изобретать велосипед. Но я могу с этим не согласиться. Во первых, создавать что-то своё всегда интересней. Во вторых, моя цель - сделать самый лучший фреймворк на PHP, как бы самоуверенно или даже глупо это ни звучало :-) . Я назвал свой фреймворк Ant (что по инглишу Муравей). И пусть это название символизирует его скорость и трудолюбие. Итак, приступим.

В чём соль

Муравей спроектирован по аналогии знаменитого CodeIgniter'a. Но при этом каждая его строчка была написана с нуля. Отличие заключается в том, что задача муравья - не простота разработки (хотя она тоже присутствует ввиду структуры), или, как кто-то в Сети сказал "для быстрого старта и для неопытного программиста", а наименьшее время выполнения и простота самого кода. Как оказалось, CodeIgniter не лишён излишеств, в нём можно увидеть такие сущности, без которых вполне можно обойтись.

Вот несколько примеров:

function item($item, $index = '')
{ if ($index == '')
{
if ( ! isset($this->config[$item]))
{
return FALSE;
}
$pref = $this->config[$item];
}
else
{
if ( ! isset($this->config[$index]))
{
return FALSE;
}
if ( ! isset($this->config[$index][$item]))
{
return FALSE;
} $pref = $this->config[$index][$item];
}
return $pref;
}

Класс CI_config, как оказалось, загружает конфиг и возвращает некий элемент конфига по запросу (а еще делает кучу всяких ненужных и необязательных операций). К чему эти костыли? И это вместо двух строчек кода:

    $variable =& get_config('config_name');
    echo $variable['item']; // или любое другое использование

Возьмём к примеру метод Benchmark::elapsed_time() аналогичный у муравья benchmark::get_time():

CodeIgniter:

function elapsed_time($point1 = '', $point2 = '', $decimals = 4)
{
if ($point1 == '')
{ return '{elapsed_time}';
}
if ( ! isset($this->marker[$point1]))
{
return '';
}
if ( ! isset($this->marker[$point2]))
{
$this->marker[$point2] = microtime();
}
list($sm, $ss) = explode(' ', $this->marker[$point1]);
list($em, $es) = explode(' ', $this->marker[$point2]);
return number_format(($em + $es) - ($sm + $ss), $decimals);
}

Муравей:


public function get_time($start, $end = ''){
if(isset($this->points[$start])){
$end = (($end == '' || !isset($this->points[$end])) ? microtime(TRUE) : $this->points[$end]);
return sprintf("%001.3f", ($end - $this->points[$start]));
}
}

Разница большая, за исключением того, что я не предоставил выбор количества знаков после запятой. Таким образом написан весь код муравья. Теперь можно посмотреть разницу в работе по времени выполнения и занятой памяти. Приложения запускались на моей локальной машине CPU 2,19 ГГц, ОЗУ 1 Гб с софтом Apache 2.x, PHP 5. Кодигнайтер был запущен с базовой конфигурацией, так, как он поставляется.

CodeIgniter:

CodeIgniter

Муравей:

Ant

Любое упрощение не только повышает скорость работы приложения, но и уменьшает количество потенциальных ошибок. Именно на это муравей и направлен. При этом его конечная цель - быть таким же функциональным и богатым библиотеками, как и CodeIgniter или, например, Zend Framework, при условии сохранения таких качеств, как скорость и неприхотливость.

Муравей разрабатывается с полной поддержкой всех возможностей PHP5. Осуществлять поддержку PHP4 я не вижу смысла. Где вы видели, чтобы серьезный проект, в котором скорость была бы одним из наиболее важных критериев, базировался на хостинге с поддержкой PHP четвёртой версии?

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

Муравей был спроектирован с учётом всех необходимых возможностей при разработке реального проекта. Например, он обеспечивает работу с темами без применения хелпера или плагина, как это обычно делается в CodeIgniter-е.

Исходники я публикую в гугл коде под лицензией GPL2.

Буду рад всем замечаниям, вопросам и предложениям. Если рутина меня не съест, то в следующее воскресенье выйдет очередной выпуск.


В избранное