PHP搭建自己的web框架-程序初始化

     程序初始化,在把控制權交給控制器之前需要完成的工作,一般只做初始化工作,不做與業務有關的事情。

      具體有:

         1. 定義入口相關的環境變量

         2. 加載配置文件和引導文件

         3. 加載全局方法、通用類文件

         4. 設置環境變量、執行全局初始方法

         5. 路由設置、路由執行


        因爲統一入口,沒有特別處理的情況下,每個請求都需要執行初始化工作,如果大部分請求都做了與自己無關的初始化,那是一種浪費。所以在這個初始化過程中,所做的事情不要太多,只做通用的處理,比如網站參數定義、網站環境變量設置。對於一些與業務有關的配置文件,在具體業務時按需要引入。並且在初始化引入的功能都應該能延遲加載、延遲實例化。

        下面會作些說明,其中的代碼或文件名爲示例,僅供參考。


1. 定義入口相關的環境變量

      現在,單文件入口是比較常用的做法,方便統一控制。比如程序主目錄下面一個index.php文件作爲統一入口。

      有了統一的入口,那就有了一個程序路徑上的基準,以此使用絕對路徑來包括文件(據說使用絕對路徑比相對路徑效率高):

     define ( 'APP_PATH', dirname ( __FILE__ ) . '/' );

      當然,這個定義可以放到同級目錄的其它文件當中,需要儘早地定義,其它的路徑變量都以APP_PATH爲前綴。

2. 加載配置文件和引導文件

     在入口文件index.php, 引入配置文件:

define ( 'PATH_CONFIG', APP_PATH. 'config/' );
require PATH_CONFIG . 'config.php';



      同時導入引導文件bootstrap.php

   require APP_PATH.'bootstrap.php';

      這裏的引導文件(bootstrap.php)和配置文件(config.php),都屬於參數定義的文件,只是不同的參數定義所放的地方稍微做了區分,合併亦可。如一些相對固定的框架路徑參數定義放到bootstrap.php,一些數據庫連接參數、郵件連接參數等放到config.php。先導入哪一個文件可根據實際情況決定,config.php在入口文件導入或bootstrap.php導入都可以。以後根據需要,參數都在這兩個文件中定義,初始化工作都在bootstrap.php中完成。
bootstrap.php:
<?php
/**
 * 引導程序。
 * 
 */
define ( 'PATH_FRAMEWORK', APP_PATH . 'framework/' );
define ( 'PATH_PUBLIC', APP_PATH . 'public/' );
define ( 'PATH_RUNTIME', APP_PATH . 'runtime/' );


//[站點域名設置]
define ( 'APP_DOMAIN', $_SERVER ['SERVER_NAME'] );


if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
    define ( 'APP_HOST', 'https://' . APP_DOMAIN . '/' );
}else if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'){
	define ( 'APP_HOST', 'https://' . APP_DOMAIN . '/' );
}else{
	define ( 'APP_HOST', 'http://' . APP_DOMAIN . '/' );
}
/**
 * 靜態文件的根目錄URL前綴
*/
define ( 'URL_PUBLIC', '/public/' );


/**
 * 運行時根目錄URL前綴,存放日誌,緩存,臨時文件等。
*/

define ( 'URL_RUNTIME', '/runtime/' );

config.php:

<?php

//[網站更新時間,用於更新css,js等]
if (! defined ( 'UPDATE_TIME' )) {
        define ( 'UPDATE_TIME', '20140820' );
}


//[cookie域名設置]
define ( 'DOMAIN_NAME', '' );

//數據庫定義
define ( 'DB_USER', 'root' );
define ( 'DB_PASSWORD', '123456' );
define ( 'DB_SERVER', 'localhost' );
define ( 'DB_NAME', '' );
define ( 'DB_PORT', '' );
//DB是否持久連接:true or false
define ( 'DB_PERSISTENT', false );

//日誌
define ( 'MAX_LOG_QUANTITY', 5 );
define ( 'MAX_LOG_SIZE', "1000000" );
defined ( 'DEBUG_MODE' ) or define ( 'DEBUG_MODE', true );
define ( 'LOG_REALFILE', PATH_RUNTIME . "log/debug.log" );
//是否顯示PHP錯誤
define ( 'PHP_DISPLAY_ERRORS', true );
define ( 'PHP_ERROR_REPORTING', E_ALL ^ E_NOTICE );


define ( 'MAIL_HOST', 'smtp.exmail.qq.com' );
define ( 'MAIL_PORT', '465' );
define ( 'MAIL_USER_NAME', '' );
define ( 'MAIL_USER_PASSWD', '' );
define ( 'MAIL_FROM_NAME', '' );
define ( 'MAIL_SMTP_AUTH', true );
define ( 'MAIN_SMTP_PROTOCOL', 'ssl' );

3. 加載全局方法、通用類文件

 繼續在bootstrap.php文件,引入框架文件、通用功能模塊文件。

把全局方法定義文件、數據庫操作、session操作等網站都會用到的文件導入進來:

require PATH_CORE . 'session/Session.php';
require PATH_CORE . 'db/DBFactory.php';
require PATH_CORE . 'func/glb_function.php';
require PATH_CORE . 'page/Router.php';




最好是引用的文件中不要有自動執行的方法,這樣會失去控制。

4. 設置環境變量、執行全局初始方法

繼續在bootstrap.php文件,執行一些全局方法:
ob_start ();
date_default_timezone_set('PRC');
sanitize();
us_init ();
if (PHP_DISPLAY_ERRORS) {
	error_reporting ( PHP_ERROR_REPORTING );
}

//register_shutdown_function ( 'runtimeLog' );
set_exception_handler ( 'exception_handler' );
set_error_handler ( 'error_handler' );

5. 路由設置、路由執行

路由設置可以在入口文件或專門的文件中定義,這裏是在入口文件中設置並執行。
<?php
define ( 'APP_PATH', dirname ( __FILE__ ) . '/' );

define ( 'PATH_CONFIG', APP_PATH . 'config/' );
require PATH_CONFIG . 'config.php';
require APP_PATH.'bootstrap.php';
define ( 'APP_ACTION', APP_PATH . 'app/web/' );

$r = new Router ();
$r->setOption ( array ('base_path' => APP_ACTION  ) );
$r->add ( '/', 'get', 'index', APP_ACTION . 'page/index.php' );
$r->start ();







當然具體的執行由封裝好的路由類實現。
這樣整個初始化工作就完成了。以上的所有工作是爲了初始化,可以把代碼都寫在入口文件index.php中,但爲了清晰,適當的拆分到不同文件,但拆分的文件也不要太多。有些框架會把多個引入的初始化文件合併成一個臨時文件,以加快導入。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章