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

9 篇文章 0 订阅
7 篇文章 0 订阅

     程序初始化,在把控制权交给控制器之前需要完成的工作,一般只做初始化工作,不做与业务有关的事情。

      具体有:

         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中,但为了清晰,适当的拆分到不同文件,但拆分的文件也不要太多。有些框架会把多个引入的初始化文件合并成一个临时文件,以加快导入。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值