Поскольку я хочу смотреть именно в корень проблемы, а не быть "хомячком", которому показали несколько кнопок для получения результата и тот давит на них, я решил завести эту тему.
Признаться уже не раз я пытался начать разбирать фреймвор по кирпичикам и понять как он устроен, но уже через несколько уровней наследования начинал путаться и забрасывал это гиблое дело. Итак начнем. Начать я хочу с этого уже заезженного модуля Database. Но до того как начать с модуля хочу разобраться, как он вообще подключается. Если я где-то ошибусь, поправьте меня.
Начинается все это с файла index.php
Код:
<?php
$application = 'application';
$modules = 'modules';
$system = 'system';
define('EXT', '.php');
error_reporting(E_ALL | E_STRICT);
define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
$application = DOCROOT.$application;
if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules))
$modules = DOCROOT.$modules;
if ( ! is_dir($system) AND is_dir(DOCROOT.$system))
$system = DOCROOT.$system;
define('APPPATH', realpath($application).DIRECTORY_SEPARATOR);
define('MODPATH', realpath($modules).DIRECTORY_SEPARATOR);
define('SYSPATH', realpath($system).DIRECTORY_SEPARATOR);
unset($application, $modules, $system);
if (file_exists('install'.EXT))
{
return include 'install'.EXT;
}
if ( ! defined('KOHANA_START_TIME'))
{
define('KOHANA_START_TIME', microtime(TRUE));
}
if ( ! defined('KOHANA_START_MEMORY'))
{
define('KOHANA_START_MEMORY', memory_get_usage());
}
require APPPATH.'bootstrap'.EXT;
if (PHP_SAPI == 'cli') {
class_exists('Minion_Task') OR die('Please enable the Minion module for CLI support.');
set_exception_handler(array('Minion_Exception', 'handler'));
Minion_Task::factory(Minion_CLI::options())->execute();
}
else
{
echo Request::factory(TRUE, array(), FALSE)
->execute()
->send_headers(TRUE)
->body();
}
Непонятки начинаются уже со след. строк:
Код:
define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
Что я тут вижу: объявляется константа с именем DOCROOT в которую пишется следующее:
Из константы __FILE__ берется путь до директории (функция dirname()) в которой лежит файл index.php, потом полученная строка пропускается через realpath(), я так понял это для тех случаев, когда папка www находиться в нестандартном месте, а в папке /var указана символическая ссылка на эту папку. Описание функции realpath взял
отсюда. Потом к полученной строке дописывается т.н. DIRECTORY_SEPARATOR. Это предопределенная константа, которая определяет какой слеш используется файловой системой для разделения узлов в адресе файла (в linux это / а в windows это уже обратный \). Вроде с этой строкой все понятно. Если я в чем то соврал, поправьте. Далее идут строки:
Код:
if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
$application = DOCROOT.$application;
if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules))
$modules = DOCROOT.$modules;
if ( ! is_dir($system) AND is_dir(DOCROOT.$system))
$system = DOCROOT.$system;
В которых проверяются значения указанные в переменных выше и если значение записанное в них формирует путь до папки, а не до файла или еще до чего нить, то к этим переменным добавляется префикс состоящий из канонизированного абсолютного пути к папке, в которой лежит Кохана.
Потом идут эти строки:
Код:
define('APPPATH', realpath($application).DIRECTORY_SEPARATOR);
define('MODPATH', realpath($modules).DIRECTORY_SEPARATOR);
define('SYSPATH', realpath($system).DIRECTORY_SEPARATOR);
unset($application, $modules, $system);
В первых трех устанавливаются константы в которых записываются канонизированные абсолютные пути к папкам application, modules и system. Вот тут у меня возникает вопрос:
а зачем еще раз realpath'ом преобразовывать строку?. Последняя строка уничтожает конфигурационные переменные.
Потом проверяется наличие файла install.php
Код:
if (file_exists('install'.EXT))
{
return include 'install'.EXT;
}
У меня вопрос по условию. Вернее не по условию, а по функции file_exists(). В каких каталогах она ищет файл install.php? Смею предположить, что поиск происходит в области видимости файловой системы php-интерпретатором. Если не так, опять же, поправьте.
Далее идут строки:
Код:
if ( ! defined('KOHANA_START_TIME'))
{
define('KOHANA_START_TIME', microtime(TRUE));
}
В которых определяется константа KOHANA_START_TIME в которую пишется непонятно что. Честно говоря, прочитал описание этой функции и на php.su и на php.net но так и не понял что она возвращает. Тем более, что эта функция доступна только на системах, в которых есть системная функция gettimeofday(). В Windows она вообще будет работать? На моем минте она возвращает примерно след. значение:
Цитата:
1369733373.4979
Для чего эта константа? И будет ли она объявлена, если похапе работает на Windows IIS?
Далее идут строки:
Код:
if ( ! defined('KOHANA_START_MEMORY'))
{
define('KOHANA_START_MEMORY', memory_get_usage());
}
Из комментария я понял, что в эту константу записывается объем оперативной памяти в байтах выделенный php-скрипту на данный момент времени. Т.е. все что объявляется после в этой переменой никак не отражено.
Кажется теперь я понимаю для чего объявлять KOHANA_START_TIME и KOHANA_START_MEMORY. С помощью этих констант можно отслеживать производительность кода, время исполнения, используемые ресурсы и т.д. (опять же, если я не прав, поправьте).
Далее идет включение файла bootstap.php:
Код:
require APPPATH.'bootstrap'.EXT;
if (PHP_SAPI == 'cli') {
class_exists('Minion_Task') OR die('Please enable the Minion module for CLI support.');
set_exception_handler(array('Minion_Exception', 'handler'));
Minion_Task::factory(Minion_CLI::options())->execute();
}
else
{
echo Request::factory(TRUE, array(), FALSE)
->execute()
->send_headers(TRUE)
->body();
}
Сейчас как разберусь что значит этот кусок, дополню топик.