中间件是软件的一般术语,可以将“胶合在一起”单独,通常很复杂并且已经存在的程序。一些经常与中间件连接的软件组件包括企业应用程序和Web服务。
参考:
* http://searchsoa.techtarget.com/definition/middleware
* http://www.webopedia.com/TERM/M/middleware.html
* http://www.softwareag.com/blog/reality_check/index.php/integration-insights/middleware-for-my-mom-or-kids-guide-to-what-i-do/
* http://www.networkcomputing.com/netdesign/cdmwdef.htm
* https://en.wikipedia.org/wiki/Middleware
什么是中间件?
中间件是请求和响应之间存在的代码,可以采取传入请求,基于该请求执行操作,并完成响应或将委托书传递给队列中的下一个中间件。
https://github.com/zendframework/zend-smtratigility/blob/master/doc/book/middleware.md
HTTP中间件提供了一种方便的机制,用于过滤HTTP请求输入您的应用程序。例如,Laravel包括一个验证应用程序用户的中间件。如果未对用户进行身份验证,则中间件将将用户重定向到登录屏幕。但是,如果对用户进行身份验证,则中间件将允许请求进一步进入应用程序。
http://laravel.com/docs/master/middleware
Silex允许您运行代码,该代码在通过Middlewares处理请求时在不同阶段更改默认的Silex行为:
http://silex.sensiolabs.org/doc/middlewares.html
中间件的目的是在调用Slim应用程序之前和/或之后检查,分析或修改应用程序环境,请求和响应。
http://docs.slimframework.com/middleware/overview/
所有HTTP消息均由正在使用的HTTP协议版本,标题和消息主体组成。请求在消息上构建,以包括用于提出请求的HTTP方法以及提出请求的URI。响应包括HTTP状态代码和原因短语。
...
无论您是否是程序员,您都在网络上到处都看到了它。此刻,您的浏览器地址栏显示了以“ http://”开头的东西。即使您的第一个Hello World脚本也发送了HTTP标题,而您也没有意识到它。在本文中,我们将了解HTTP标头的基础知识以及如何在Web应用程序中使用它们。
服务器发送给客户端的HTTP响应包含标题,这些标题可以识别响应主体中的内容类型,发送响应的服务器,在身体中发送了多少个字节,发送响应时等等。PHP和Apache通常会为您提供护理,将文档照顾为HTML ,计算HTML,计算HTML的长度。大多数Web应用程序都不需要自己设置标题。但是,如果要发送回HTML的东西,请为页面设置到期时间,重定向客户端的浏览器或生成特定的HTTP错误,则需要使用header()函数。
*How to See HTTP Headers*
* Firebug extensions to analyze HTTP headers.
1. Turn in Firebug
2. Click Net
3. Click Headers
Ref:
* http://docstore.mik.ua/orelly/webprog/php/ch07_05.htm
* http://code.tutsplus.com/tutorials/http-headers-for-dummies--net-8039
*Headers already sent: Why does it happen?*
To understand why headers must be sent before output it's necessary to look at a typical HTTP response. PHP scripts mainly generate HTML content, but also pass a set of HTTP/CGI headers to the webserver:
HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>
The page/output always follows the headers. PHP has to pass the headers to the webserver first. It can only do that once. After the double linebreak it can nevermore amend them.
When PHP receives the first output (print, echo, <html>) it will flush all collected headers. Afterwards it can send all the output it wants. But sending further HTTP headers is impossible then.
PHP没有对HTTP消息的内置支持。
...
PHP流是发送HTTP请求的最方便和无处不在的方法,但对于正确配置SSL支持,构成了许多限制,并在设置诸如标题之类的内容的情况下提供了一个笨拙的接口。 Curl提供了完整且扩展的功能集,但由于不是默认扩展,通常不存在。 HTTP扩展与卷发相同的问题,以及传统上其用法的示例较少的事实。
大多数现代的HTTP客户库库都倾向于抽象实现,以确保它们可以在上述任何层次上执行的任何环境中工作。
笔记:
cURL allows you to connect and communicate to many different types of servers with many different types of protocols.
(http://php.net/manual/en/intro.curl.php)
PHP使用服务器API(SAPI)来解释传入的HTTP请求,元帅输入并将其传递给脚本。原始的SAPI设计镜像了通用网关接口,该接口将元使用数据并将其推入环境变量,然后将其转移到脚本上。然后,脚本将从环境变量中提取以处理请求并返回响应。
PHP的SAPI设计摘要摘要通用输入源,例如Cookie,查询字符串参数和通过SuperGlobals(分别为$ _COOKIE,$ _GET和$ _POST)的URL编码的帖子内容,为Web开发人员提供了一层便利性。
...
直接使用超级全局存在许多问题。首先,这些都是可变的,这使得库和代码可以更改值,从而改变应用程序的状态。此外,超级全局使单位和集成测试变得困难且脆弱,从而导致代码质量降解。
...
最后,当涉及服务器端响应时,PHP以自己的方式获得:在呼叫()呼叫之前发出的任何内容都会导致该调用变为no-op;根据错误报告设置,这通常意味着标题和/或响应状态未正确发送。解决此问题的一种方法是使用PHP的输出缓冲功能,但是输出缓冲区的嵌套可能会变得有问题且难以调试。因此,框架和应用程序倾向于为汇总的标头和内容创建响应抽象,这些响应可以立即发出 - 这些抽象通常是不兼容的。
Ref: http://www.php-fig.org/psr/psr-7/meta/
您可以使用超级全局变量(如$ _get和$ _post),但它们是全球可变状态。随着该单元和代码的集成测试,很难。
由于这些原因,许多PHP框架决定实施弃权来表示HTTP消息(例如,请参见Symfony HTTPFOUNDATION或ZEND HTTP)。
这导致了任何应用程序基于HTTP消息的特定实现的情况,因此在使用其他框架构建的项目中几乎不可用。
这就是为什么一组通用的接口有助于抽象HTTP消息并以框架不可知论的方式与之合作的原因。
Ref: http://stackoverflow.com/questions/32805681/php-why-http-message-implementations
HTTP用于传输资源,而不仅仅是文件。资源是可以通过URL识别的一些信息(这是URL中的R)。最常见的资源是一个文件,但是资源也可能是动态生成的查询结果,CGI脚本的输出,以几种语言或其他内容可用的文档。
参考:
* http://www.w3schools.com/tags/ref_httpmessages.asp
* https://www.jmarshall.com/easy/http/