入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2016-01-03 投稿人: 浏览次数:1296

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

      具体有:

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


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。