菜单

运行机制

2018年11月16日 - Java

立马无异于篇我们来大概了解一下JAVA的运行机制

yii处理http请求时,执行的流水线是这样的:

大致可以分为三大部分

1、服务器收到及自客户端(比如浏览器)的请求,服务器(比如nginx)根据局部中转规则把要转发让入口脚本web/index.php
2、入口加班加载配置文件,实例化一个使。
3、应用通过request应用组件解析路由。
4、应用创建controller实例处理要。
5、controller创建action实例并也之action执行有关的filter操作。
6、如果另外一个filter验证失败,就不实行是动作,如果尽之filter通过认证,就会继续执行
7、动作会加载数据模型,一般由数据库被读取
8、加载了数据渲染一个view,并且把需要的数码并填充到这view中。
9、渲染得到的结果碰头回去给response组件。
10、response组件把渲染结果回到给浏览器。

1.编写程序

下是yii官方文档中之示意图。

2.编译程序

图片 1

3.运作程序

起先引导

在动用起来解析并拍卖接受请求之前,要先行准备条件。启动引导会在少单地方实行,入口脚本和动中心。在进口脚本里,需要注册各个类库的好像公事自动加载器,加载配置文件,实例化应用核心。

实例化应用核心,会执行下核心的构造函数,在构造函数中做这些从:
1、调用
yii\base\Application::preInit()方法,配置高优先级的使性能。
2、注册errorHandler函数
3、调用init方法,运行引导组件。init方法做的从业:1、加载vendor/yiisoft/extensions.php扩展清单文件,创建运行各个扩展的带组件,创建并运行各个零部件和于使用的bootstrap属性中宣称的顺序模块组件。

以带工作必须于拍卖每一次吁之前还进行相同遍,因此尽量不要注册太多带组件。

 

路由引导

当输入下部论中调用yii\web\Application::run()
方法时,首先使分析输入的伸手,用request组件的
yii\web\Request::resolve()
方法实现,确定拖欠用谁controller处理要,然后实例化对应之controller处理要,如果请实在不能够给确定拖欠由哪位controller处理,request组件会抛出yii\web\NotFoundHttpException
异常。

1.编写程序

缺省路由

假定请没有供具体的路由,这个上就会见启用yii\web\Application::defaultRoute
属性所指定的缺省路由。该属性的默认值为 site/index,它对 site 控制器的
actionIndex,可以以配置文件被安装该属性。

编写程序就是咱们前面说的源代码

catchAll路由

而你的web服务整在保安,不思为用户访问,这个上可以设置catchAll属性,它可拿具有的呼吁都分析到和一个路由。

这些源代码都产生特的语法

创建action

只要请求路由给确定了,紧接着便如创建action对象,用来响应这路由。

路由可用斜线分割成多只结合部分,栗子:site/index可以解释为site和index,它们凭借于有一个module、controller或action。

起路由的率先只有开始,按下的流水线同样软创module、controller或action,如果这些手续有另错误产生,就会抛出yii\web\NotFoundHttpException。

先找到site对应的controller。

以controller里面找到index的action,如果找的及,就创办一个action对象,如果找不至,controller会尝试创建一个action和其相呼应

例如main函数

请求

一个用之呼吁是因此yii\web\Request
对象来表示的,该对象提供了请参数、HTTP头、cookies等消息,可以透过request组件获得对应的乞求对象。

斯组件提供了一部分道好拿走有关信息:

获请求的参数与措施
yii\web\Request::get()
yii\web\Request::post()
yii\web\Request::getBodyParam()
Yii::$app->request->method,

获取Url信息
设若为求的URL是
http://example.com/admin/index.php/product?id=100,
可以像下描述的那样得到URL的依次组成部分:

yii\web\Request::url:返回 /admin/index.php/product?id=100,
此URL不包括host info部分。
yii\web\Request::absoluteUrl:返回
http://example.com/admin/index.php/product?id=100,
包含host info的整个URL。
yii\web\Request::hostInfo:返回
http://example.com,
只有host info部分。
yii\web\Request::pathInfo:返回 /product,
这个是进口脚本后,问号之前(查询字符串)的部分。
yii\web\Request::queryString:返回 id=100,问号之后的有的。
yii\web\Request::baseUrl:返回 /admin, host info之后,
入口脚本之前的片。
yii\web\Request::scriptUrl:返回 /admin/index.php, 没有path
info和询问字符串部分。
yii\web\Request::serverName:返回 example.com, URL中的host name。
yii\web\Request::serverPort:返回 80, 这是web服务着使用的端口。

获取HTTP头信息
Yii::$app->request->header: 返回yii\web\HeaderCollection 对象
yii\web\Request::userAgent:返回 User-Agent 头。
yii\web\Request::contentType:返回 Content-Type 头的价, Content-Type
是请求求体中MIME类型数据。
yii\web\Request::acceptableContentTypes:返回用户可承受之内容MIME类型。
返回的类是据他们之身分得分来排序的,得分最高的档次将受首届回到。
yii\web\Request::acceptableLanguages:返回用户可领的语言。
返回的言语是遵照他们的偏好层次来排序的。第一只参数代表最优先的语言。

取客户端音
yii\web\Request::userHost 获取host name
yii\web\Request::userIP 获取客户机的IP地址

外是jdk中一个较特殊的函数

响应

当以得处理一个央后,
会生成一个yii\web\Response响应对象并发送给客户端,响应对象涵盖的信有HTTP状态码,HTTP头和主体内容相当,
web应用开发的尾声目的本质上虽是根据不同的伸手构建这些应对象。

HTTP状态码设置法

Yii::$app->response->statusCode = 200;

HTTP头部设置法

$headers = Yii::$app->response->headers;
// 增加一个 Pragma 头,已存在的Pragma 头不会见叫蒙。
$headers->add(‘Pragma’, ‘no-cache’);
// 设置一个Pragma 头. 任何已存在的Pragma 头都见面为丢
$headers->set(‘Pragma’, ‘no-cache’);
// 删除Pragma 头并回到去的Pragma 头的值到数组
$values = $headers->remove(‘Pragma’);

响应中心设置法

Yii::$app->response->content = ‘hello world!’;
要是当殡葬给终端用户之前用格式化,应安装 yii\web\Response::format 和
yii\web\Response::data 属性,yii\web\Response::format
属性指定yii\web\Response::data中数据格式化后底体裁,栗子:
<pre>
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = [‘message’ => ‘hello world’];
</pre>

Yii支持以下但径直以的格式

yii\web\Response::FORMAT_HTML
yii\web\Response::FORMAT_XML
yii\web\Response::FORMAT_JSON
yii\web\Response::FORMAT_JSONP

设未指定,在action中调用render方法渲染视图默认yii\web\Response::FORMAT_HTML,

方介绍的这些办法好叫显式地安装,但是多数场面下通过操作方法的返回值隐式设置,如果想用其它格式,只需要在回到数据之前设置$response->format即可。

他必须使利用一定的语法来修

浏览器跳转

浏览器跳转依赖让发送一个Location
HTTP 头,Yii是这样支持之:可以调用yii\web\Response::redirect()
方法将用户浏览器跳反到一个URL地址,在action中,可以调用缩写版的redirect,栗子:

return
$this->redirect(‘http://example.com/new’,
301);

顿时行代码会返回一个应对象发送给终端用户,除了是,还得当redirect()之后重新一直调用send()方法来管没有外内容充实至应中。栗子:

\Yii::$app->response->redirect(‘http://example.com/new’,
301)->send();

yii\web\Response::redirect()
方法默认会设置响应状态码为302,该状态码会告诉浏览器请求的资源 临时
放在其他一样地址上,可传递一个301状态码告知浏览器请求的资源曾 永久
重定向到新的地址。

如果手上呼吁是ajax请求,这样发送location是休会见跳转的,解决办法:yii\web\Response::redirect()
方法设置一个价值为而跳转的URL的X-Redirect 头,在浏览器用JavaScript
代码读取该头部值然后吃浏览器跳转对应之URL。

(在前边加上 public  等关键字来修饰)

出殡文书

Yii提供这些办法支持各种文件的发送需求:

yii\web\Response::sendFile(): 发送一个都在的文件及客户端
yii\web\Response::sendContentAsFile():
发送一个文本字符串作为文件及客户端
yii\web\Response::sendStreamAsFile():
发送一个早已在的文本流作为文件及客户端

源代码就比如是程序的魂,

发送响应###\

用yii\web\Response::send()
方法发送响应,在是艺术调用前应的内容未会见回来给客户端,默认在yii\base\Application::run()
结尾自动调用,也足以手动调用这个点子强制立刻发送。这个主意运用这些步骤发送响应:

触发 yii\web\Response::EVENT_BEFORE_SEND 事件.
调用 yii\web\Response::prepare() 来格式化 yii\web\Response::data 为
yii\web\Response::content.
触发 yii\web\Response::EVENT_AFTER_PREPARE 事件.
调用 yii\web\Response::sendHeaders() 来发送注册之HTTP头
调用 yii\web\Response::sendContent() 来发送响应中心内容
触发 yii\web\Response::EVENT_AFTER_SEND 事件.

一旦yii\web\Response::send()
方法给执行后,在其余地方调用这个主意就会见为忽视,
就是说一旦响应发出后,就非能够重新添另外内容。

次的落实是出于源代码来即使决定的

Sessions

session可以经过session 应用组件访问sessions,它是
yii\web\Session 的实例。session组件提供了这些性和法:
<pre>
$session = Yii::$app->session;
if ($session->isActive) …// 检查session是否打开
$session->open(); // 开启session
$session->close(); //
关闭session,多次调整用open和close不会见有错误,因为方法中会预先检查session是否早已打开。
$session->destroy(); // 销毁session中存有已注册之多寡

// 获取session中之变量值,这些用法是一模一样的:

$language = $session->get(‘language’);
$language = $session[‘language’];
$language = isset($_SESSION[‘language’]) ? $_SESSION[‘language’] :
null;

// 设置一个session变量,这些用法是如出一辙的:
$session->set(‘language’, ‘en-US’);
$session[‘language’] = ‘en-US’;
$_SESSION[‘language’] = ‘en-US’;

// 删除一个session变量,这些用法是相同的:
$session->remove(‘language’);
unset($session[‘language’]);
unset($_SESSION[‘language’]);

// 检查session变量是否就在,这些用法是同样之:

if ($session->has(‘language’)) …
if (isset($session[‘language’])) …
if (isset($_SESSION[‘language’])) …

// 遍历所有session变量,这些用法是一样之:

foreach ($session as $name => $value) …
foreach ($_SESSION as $name => $value) …
</pre>
tips:使用session组件访问session数据的上,如果session没有机关启,和透过$_SESSION不同,使用$_SESSION之前用事先实施session_start().

当session数据是数组时,session组件只允许修改第一层数的价值,但是好读取第二交汇后的数目,栗子:
<pre>
$session = Yii::$app->session;
// 如下代码不见面生效

$session[‘captcha’][‘number’] = 5;
$session[‘captcha’][‘lifetime’] = 3600;

// 如下代码会收效:

$session[‘captcha’] = [
‘number’ => 5,
‘lifetime’ => 3600,
];

// 如下代码也会见立竿见影

echo $session[‘captcha’][‘lifetime’];
</pre>

尽管比如相同块橡皮泥,

自定义Session存储

yii\web\Session默认把session数据保存也文件,Yii提供下面这些近似可以保存也歧之款式:

yii\web\DbSession: 保存及数据库
yii\web\CacheSession: 保存至缓存,需要在配备文件中配置相关的休养生息存组件
yii\redis\Session: 保存到redis

这些session类都支持相同之api,因此切换不同的session类非待改以session的代码。

tips:如果经过$_SESSION访问使由定义存储介质的session,需要保证session已经为此yii\web\Session::open()
开启, 因为只有在此点子被见面登记由定义session存储处理器。

乃想把它成为什么样子完成由而来决定

Cookies

Yii使用
yii\web\Cookie对象来表示每个cookie,yii\web\Request(维护请求提交的cookies)
和 yii\web\Response(维护返回给用户的cookies)
通过叫也’cookies’的习性维护一个cookie集合。

读取cookies,栗子:
<pre>
$cookies = Yii::$app->request->cookies;

// 获取名为 “language” cookie 的价,如果无在,返回默认值”en”
$language = $cookies->getValue(‘language’, ‘en’);

// 另一样种办法得到名也 “language” cookie 的值
if (($cookie = $cookies->get(‘language’)) !== null) {
$language = $cookie->value;
}

// 可将 $cookies当作数组使用
if (isset($cookies[‘language’])) {
$language = $cookies[‘language’]->value;
}

// 判断是否在叫也”language” 的 cookie
if ($cookies->has(‘language’)) …
if (isset($cookies[‘language’])) …
</pre>
发送cookies,栗子:
<pre>
$cookies = Yii::$app->response->cookies;
// 在如发送的应中添加一个初的cookie
$cookies->add(new \yii\web\Cookie([
‘name’ => ‘language’,
‘value’ => ‘zh-CN’,
]));

// 删除一个cookie
$cookies->remove(‘language’);

// 等同于以下删除代码
unset($cookies[‘language’]);
</pre>

 

2.编译程序

为何要编译?

盖 JAVA以及多数语言同样是平等种尖端语言

咱编辑好的代码都给保存成为一个.java的文件

唯独我们计算机连无认得(不能够运行)这些文件

当下即用拿我们编辑好之文书(源代码)变成计算机可以运行的机器码(二进制码)

夫历程就称为编译

专注:编译就是咱前面用到的 javac
命令

它们可以将.java文件编译成一个.class文件(字节码)

还要class文件是如出一辙种植和平台无关之公文

 

3.周转程序

点说交管源代码编译成字节码。

那尽管顶运行字节码了

实际我们的JAVA语言有一个可怜坏之表征就是超平台

所以他们话说就是是:一糟糕编译,到处运行

眼前说罢class文件是一模一样种植和平台无关的公文

它们吗不足直接运行

这就是说我们怎么运作吧?

这便设讲话到一个东西jvm(JAVA虚拟机)

它可以以我们的class文件说明成计算机可以运行的二进制

那么咱们的jvm是何等运行的也罢

我们且懂得有程序只有在内存中才能够运作

故而我们在运作JAVA文件的下(java命令)

率先会见当内存中开创一个jvm

然后拿硬盘里的class文件加载进来

应用jvm去说这些class文件

说到底运行程序。

 

 

PS:为什么说JAVA跨平台

1.以编译后的class文件只能给jvm所诠释

2.别平台要出jvm(JAVA运行条件)就可以解释是class文件

3.无论啊平台解释及一个class文件最后的结果都是千篇一律的

也就是说我因此Windows系统编译好之class文件,拿来Android(前提假设发出环境)上运行吧是同的

 

相关文章

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图