Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 16 июл 2020, 18:42

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 28 май 2013, 14:41 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 апр 2013, 14:09
Сообщения: 162
Поскольку я хочу смотреть именно в корень проблемы, а не быть "хомячком", которому показали несколько кнопок для получения результата и тот давит на них, я решил завести эту тему.

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

Начинается все это с файла index.php
Код:
<?php

/**
 * The directory in which your application specific resources are located.
 * The application directory must contain the bootstrap.php file.
 *
 * @link http://kohanaframework.org/guide/about.install#application
 */
$application 'application';

/**
 * The directory in which your modules are located.
 *
 * @link http://kohanaframework.org/guide/about.install#modules
 */
$modules 'modules';

/**
 * The directory in which the Kohana resources are located. The system
 * directory must contain the classes/kohana.php file.
 *
 * @link http://kohanaframework.org/guide/about.install#system
 */
$system 'system';

/**
 * The default extension of resource files. If you change this, all resources
 * must be renamed to use the new extension.
 *
 * @link http://kohanaframework.org/guide/about.install#ext
 */
define('EXT''.php');

/**
 * Set the PHP error reporting level. If you set this in php.ini, you remove this.
 * @link http://www.php.net/manual/errorfunc.configuration#ini.error-reporting
 *
 * When developing your application, it is highly recommended to enable notices
 * and strict warnings. Enable them by using: E_ALL | E_STRICT
 *
 * In a production environment, it is safe to ignore notices and strict warnings.
 * Disable them by using: E_ALL ^ E_NOTICE
 *
 * When using a legacy application with PHP >= 5.3, it is recommended to disable
 * deprecated notices. Disable with: E_ALL & ~E_DEPRECATED
 */
error_reporting(E_ALL E_STRICT);

/**
 * End of standard configuration! Changing any of the code below should only be
 * attempted by those with a working knowledge of Kohana internals.
 *
 * @link http://kohanaframework.org/guide/using.configuration
 */

// Set the full path to the docroot
define('DOCROOT'realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);

// Make the application relative to the docroot, for symlink'd index.php
if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
    
$application DOCROOT.$application;

// Make the modules relative to the docroot, for symlink'd index.php
if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules))
    
$modules DOCROOT.$modules;

// Make the system relative to the docroot, for symlink'd index.php
if ( ! is_dir($system) AND is_dir(DOCROOT.$system))
    
$system DOCROOT.$system;

// Define the absolute paths for configured directories
define('APPPATH'realpath($application).DIRECTORY_SEPARATOR);
define('MODPATH'realpath($modules).DIRECTORY_SEPARATOR);
define('SYSPATH'realpath($system).DIRECTORY_SEPARATOR);

// Clean up the configuration vars
unset($application$modules$system);

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

/**
 * Define the start time of the application, used for profiling.
 */
if ( ! defined('KOHANA_START_TIME'))
{
    
define('KOHANA_START_TIME'microtime(TRUE));
}

/**
 * Define the memory usage at the start of the application, used for profiling.
 */
if ( ! defined('KOHANA_START_MEMORY'))
{
    
define('KOHANA_START_MEMORY'memory_get_usage());
}

// Bootstrap the application
require APPPATH.'bootstrap'.EXT;

if (
PHP_SAPI == 'cli'// Try and load minion
{
    
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
{
    
/**
     * Execute the main request. A source of the URI can be passed, eg: $_SERVER['PATH_INFO'].
     * If no source is specified, the URI will be automatically detected.
     */
    
echo Request::factory(TRUE, array(), FALSE)
        ->
execute()
        ->
send_headers(TRUE)
        ->
body();
}

 

Непонятки начинаются уже со след. строк:
Код:
// Set the full path to the docroot
define('DOCROOT'realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR); 

Что я тут вижу: объявляется константа с именем DOCROOT в которую пишется следующее:
Из константы __FILE__ берется путь до директории (функция dirname()) в которой лежит файл index.php, потом полученная строка пропускается через realpath(), я так понял это для тех случаев, когда папка www находиться в нестандартном месте, а в папке /var указана символическая ссылка на эту папку. Описание функции realpath взял отсюда. Потом к полученной строке дописывается т.н. DIRECTORY_SEPARATOR. Это предопределенная константа, которая определяет какой слеш используется файловой системой для разделения узлов в адресе файла (в linux это / а в windows это уже обратный \). Вроде с этой строкой все понятно. Если я в чем то соврал, поправьте. Далее идут строки:
Код:
// Make the application relative to the docroot, for symlink'd index.php
if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
    
$application DOCROOT.$application;

// Make the modules relative to the docroot, for symlink'd index.php
if ( ! is_dir($modules) AND is_dir(DOCROOT.$modules))
    
$modules DOCROOT.$modules;

// Make the system relative to the docroot, for symlink'd index.php
if ( ! is_dir($system) AND is_dir(DOCROOT.$system))
    
$system DOCROOT.$system;
 

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

Потом идут эти строки:
Код:
// Define the absolute paths for configured directories
define('APPPATH'realpath($application).DIRECTORY_SEPARATOR);
define('MODPATH'realpath($modules).DIRECTORY_SEPARATOR);
define('SYSPATH'realpath($system).DIRECTORY_SEPARATOR);

// Clean up the configuration vars
unset($application$modules$system);
 

В первых трех устанавливаются константы в которых записываются канонизированные абсолютные пути к папкам application, modules и system. Вот тут у меня возникает вопрос: а зачем еще раз realpath'ом преобразовывать строку?. Последняя строка уничтожает конфигурационные переменные.

Потом проверяется наличие файла install.php
Код:
if (file_exists('install'.EXT))
{
    
// Load the installation check
    
return include 'install'.EXT;
}
 

У меня вопрос по условию. Вернее не по условию, а по функции file_exists(). В каких каталогах она ищет файл install.php? Смею предположить, что поиск происходит в области видимости файловой системы php-интерпретатором. Если не так, опять же, поправьте.

Далее идут строки:
Код:
/**
 * Define the start time of the application, used for profiling.
 */
if ( ! defined('KOHANA_START_TIME'))
{
    
define('KOHANA_START_TIME'microtime(TRUE));


В которых определяется константа KOHANA_START_TIME в которую пишется непонятно что. Честно говоря, прочитал описание этой функции и на php.su и на php.net но так и не понял что она возвращает. Тем более, что эта функция доступна только на системах, в которых есть системная функция gettimeofday(). В Windows она вообще будет работать? На моем минте она возвращает примерно след. значение:
Цитата:
1369733373.4979

Для чего эта константа? И будет ли она объявлена, если похапе работает на Windows IIS?

Далее идут строки:
Код:
/**
 * Define the memory usage at the start of the application, used for profiling.
 */
if ( ! defined('KOHANA_START_MEMORY'))
{
    
define('KOHANA_START_MEMORY'memory_get_usage());
}
 

Из комментария я понял, что в эту константу записывается объем оперативной памяти в байтах выделенный php-скрипту на данный момент времени. Т.е. все что объявляется после в этой переменой никак не отражено.

Кажется теперь я понимаю для чего объявлять KOHANA_START_TIME и KOHANA_START_MEMORY. С помощью этих констант можно отслеживать производительность кода, время исполнения, используемые ресурсы и т.д. (опять же, если я не прав, поправьте).

Далее идет включение файла bootstap.php:
Код:
// Bootstrap the application
require APPPATH.'bootstrap'.EXT;

if (
PHP_SAPI == 'cli'// Try and load minion
{
    
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
{
    
/**
     * Execute the main request. A source of the URI can be passed, eg: $_SERVER['PATH_INFO'].
     * If no source is specified, the URI will be automatically detected.
     */
    
echo Request::factory(TRUE, array(), FALSE)
        ->
execute()
        ->
send_headers(TRUE)
        ->
body();
}
 

Сейчас как разберусь что значит этот кусок, дополню топик.

_________________
Они плакали и кололись, но продолжали есть кактус!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 31 май 2013, 13:27 
Не в сети
Зеленый

Зарегистрирован: 14 май 2013, 08:23
Сообщения: 9
nkl писал(а):
Код:
define('APPPATH', realpath($application).DIRECTORY_SEPARATOR);
define('MODPATH', realpath($modules).DIRECTORY_SEPARATOR);
define('SYSPATH', realpath($system).DIRECTORY_SEPARATOR);

Вот тут у меня возникает вопрос: а зачем еще раз realpath'ом преобразовывать строку?


Потому, что эти объявления:
Код:
$modules = 'modules';
$system = 'system';


могут быть например такими:
Код:
$modules = '../kohana/3.2/modules';
$system = '../kohana/3.2/system';

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

nkl писал(а):
У меня вопрос по условию. Вернее не по условию, а по функции file_exists().

Проверяет наличие файла в той-же директории, что и сам файл index.php (на лицо белые пятна в основах php).

Цитата:
В которых определяется константа KOHANA_START_TIME в которую пишется непонятно что.

Вполне понятно, что пишется время "начала выполнения скрипта", используется для профайлера.

Сам профайлер можешь посмотреть добавив в главный шаблон вывод оного:
Код:
View::factory('profiler/stats');


Судя по постам, рекомендовал бы подтянуть знания по php.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июн 2013, 10:11 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 11 апр 2013, 14:09
Сообщения: 162
Цитата:
Проверяет наличие файла в той-же директории, что и сам файл index.php (на лицо белые пятна в основах php).

Ведь искал же описание функции и так ничего и не нашел. Спасибо. По поводу пробелов в знании php, все приходит с опытом, подтягиваю как могу.

_________________
Они плакали и кололись, но продолжали есть кактус!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июн 2013, 13:49 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
nkl> http://www.php.net/download-docs.php я так полагаю данным справочником ты не пользуешься

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 04 июн 2013, 15:40 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 03 июн 2013, 00:18
Сообщения: 32
Разбирать любой фреймворк начиная с index.php - бесполезно. Ибо на нем же и закончишь.

Разбирай классы фреймворка, которые тебе приходится расширять при написании приложения.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group