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中,但为了清晰,适当的拆分到不同文件,但拆分的文件也不要太多。有些框架会把多个引入的初始化文件合并成一个临时文件,以加快导入。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: PHP之session机制和优化
- 下一篇:没有了