大可网

您现在的位置是:首页>文章详情

文章详情

php一次请求完成的过程,QEEPHP一次完整请求的过程

2022-01-06 708热度
摘要:首先,看如下代码: $app_config = require(dirname(__FILE__) . '/_code/config/boot.php'); require $app_config['QEEPHP_DIR'] . '/library/q.php'; require $app_config['APP_DIR'] . '/myapp.php'; 解析: 通过调用boot.ph...

首先,看如下代码:

$app_config = require(dirname(__FILE__) . '/_code/config/boot.php');

require $app_config['QEEPHP_DIR'] . '/library/q.php';

require $app_config['APP_DIR'] . '/myapp.php';

解析:

通过调用boot.php文件将此网站基本的配置信息保存在变量$app_config

其中比较重要的配置信息有:框架根目录的指定、运行模式的选择、各个配置程序的目录设定、定义缓存配置文件要使用的缓存服务及策略

包含核心文件q.php ,核心文件主要内容我总结为以下几类:

调用类库及其文件的load方法。

读取和设置配置信息的方法。

注册对象及其判断是否注册过对象的方法。

缓存读写方法。

自动includ设置、渲染控件方法、处理数组的方法。

自定义的常用4个函数

Q::registerAutoload()这个函数将注册自动类的载入方法。

包含应用程序的基本启动流程和初始化操作的myapp类库注:在以上的步骤中仅仅保存了一个配置变量、注册了一个自动类载入的方法和包含了所需要的核心类库文件Q和启动文件  myapp

接下来进入正题开始初始化流程:

先上代码:

$ret = MyApp::instance($app_config)->dispatching();

if (is_string($ret)) echo $ret;

return $ret;

虽然这里的代码很简单,但它完成了一次完整的响应过程。

分开来详细说明:

MyApp::instance($app_config)

解析:这是一个初始化MyApp类的一个操作;

打开此文件首先查看instance方法;它仅仅是做了一个  new MyApp的一个操作-->

继续追踪构造函数,以下操作被执行:

是否记录执行脚本开始时间(一般开发模式需要查看页面载入时间)

禁止 magic quotes、处理转义的全局变量

自定义异常处理

开始载入配置信息;由于配置信息室需要缓存的,所以这里会判断配置信息的缓存是否存在或者是否失效,如果有缓存则直接调用缓存文件,并用Q::replaceini($config)注册整个系统所需要的配置信息。

这里要注意,由于系统生成项目的配置信息不是所有的,你可以根据项目根目录下 qeephp/library/_config/default_config.php文件查看qeephp所有的配置项,根据自己的需要增加你所需要的配置信息即可;

如果需要增加额外的配置文件,如需要SEO.YAML专门存储所需要的title、content、keyword,则需要在方法_initConfig()方法下增加调用的配置文件,如在files数组中增加一项SEO的信息。

设置SESSION、默认时区设置、导入类搜索路径、将myApp的注册对象添加到QEEPHP的核心注册表中。这样基本上完成了MyApp::instance($app_config)的初始化过程;接下来就是要处理所需要的请求了。这里拿HELLOWORD的例子做说明。

上代码:

$ret = MyApp::instance($app_config)->dispatching();

执行MyApp的方法dispatching()

解析:

构造运行时上下文对象

如果使用的不是standard,则需要在此进行路由的初始化设置;

获取当前请求URL的$_GET参数,经过过滤和规则化赋给context的4个基本属性值controller、action、namespace、module。

将当前请求中包含的控制器、动作、名字空间和模块名提取出来,构造为一个 UDI

使用authorizedUDI方法检查获取到的角色信息是否允许访问当前的UDI(即当前请求的URL),如果不允许访问则返回_on_access_denied方法输出304错误。

组合当前UDI所需要的控制器名称、路径、类名,如果不存在则在此返回404错误信息;

如果该控制器存在,且当前action(动作)已经定义,则实例化此控制器。

实例化此控制器将触发生成的abstract.php和qeephp/library/web/controller_abstract.php的构造函数过程

abstract.php将保存MyApp对象到$this->_app属性里

controller_abstract.php将context的对象保存在$this->_context属性里

利用existsAction方法检查当前动作是否存在,如果不存在首先调用abstract.php中定义的_on_action_not_defined的404错误,如果未定义则调用MyApp文件的_on_action_not_defined的404错误;如果存在则call_user_func_array(array($this, $action_method),$args)执行当前动作的代码,然后实例化模板引擎QView_Render_PHP;

对于模板引擎对象,首先导入基本的URL、当前UDI为变量,然后将控制器中的$this->_view数组变量传进模板引擎对象中的_vars属性里。

判断返回的$response的值,如果在控制器中使用$this->redirect()或者$this->_redirect()则更改所需要跳转的URL重新执行MyApp的dispatching()方法。如果没有跳转结尾,则执行模板引擎对象中的execute方法。

模板引擎中execute–渲染视图并返回渲染结果。

$output = $this->_parser->assign($vars)->parse($filename);由于此过程还没太多时间研究,对view层里使用block、element、control等的渲染基本上都在这几个方法中实现,等有时间了再补充进来。这样,基本上一次请求的所有处理过程就结束了,而dispatching()的返回值就是最后的html代码,输出$ret即结束了。

相关文章

文章评论

暂无任何评论,请君畅言