The DoYouHaoBaby PHP Framework中文开发文档手册
Copyright(c) DoYouHaoBaby.NET All Rights Reserved.
[ 单一入口 ]
什么是单一入口应用程序?

在解释什么是单一入口应用程序之前,我们先来看看非单一入口的一个简单 web 应用程序。

list.php 显示文章列表
article_show.php 显示单个文章页面

这两个页面不但分别实现了两个功能,还成为了应用程序的两个入口。

然后单一入口的应用程序实际上就是说用一个文件处理所有的 HTTP 请求。例如不管是文章列表功能还是文章显示,都是从浏览器访问 index.php 文件。这个 index.php 文件就是这个应用程序的单一入口。

index.php 如何知道用户是要使用哪一个功能呢?
很简单,我们访问 index.php 时跟上一个特定的参数就行了。例如 index.php?action=list 就是显示文章列表,而 index.php?action=show 就是文章显示。


而在 index.php 里面,仅用两行代码就可以实现这种效果。
 

  1. // 参数   
  2. $sAction = $_GET['action'] == '' ? 'index' : $_GET['action'];   
  3. include('files/' . $sAction . '.php');   


上面的代码中,第一行是从 url 中取出 action 参数。如果没有提供 action 参数,就设置一个默认的 'index' 作为参数。
第二行代码就是根据 $action 参数调用不同的代码文件,从而实现单一入口对应不同功能的效果。

 

单一入口应用程序的设计思想

当web服务器(apache或者iis)收到一个http请求时,会解析该请求,确定要访问哪一个文件。例如:http://www.doyouhaobaby.com/list.php 的解析结果就是要求web服务器解析 list.php 文件,并返回结果给浏览器。

现在看看单一入口应用程序的 index.php 文件,就会发现 index.php 实际上根据 url 参数进行了第二次解析。完成这个解析的程序一般称为 Dispatcher( URL解析器 ),大概意思就是将不同的请求转发到不同的处理程序进行处理。
 

在单一入口应用程序中,index.php 和 web服务器一起构成了一个 Dispatcher,根据 http 请求和 url 参数来确定请求的处理程序。
了解了 Dispatcher 的概念后,我们可以发现前面提到的两行代码实际上就是一个最简单的 Dispatcher 实现:
 

  1. // 判断   
  2. $sAction = $_GET['action'] == '' ? 'index' : $_GET['action'];   
  3. include('files/' . $sAction . '.php');   

诚然,对于一个安全、健壮的应用程序,Dispatcher 肯定不是上面那么简单。在调用实际代码前,还会加上各种判断、安全性检查等。例如判断 url 指定的功能是否可以访问以及 url 中包含了无效的参数。
 

单一入口应用程序的优势

单一入口应用程序的所有http请求都是通过 index.php 接收并转发到功能代码去的,所以我们在 index.php 里面就能完成许多实际工作。


这里我只拿安全性检查为例详细说明一下:


      由于所有的 http 请求都由 index.php 接收,所以可以进行集中的安全性检查。如果不是单一入口,那么开发者就必须记得在每一个文件的开始加上安全性检查代码(当然,安全性检查代码可以写到另一个文件中,只需要include进来就可以了)。
但我想大家都是懒人,也许记性也不好,难免有忘记的时候。因此要记得在每一个文件前面都加上必要的include可不是件容易做到的事情。


与安全性检查类似。在入口里,我们还可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等各种可以集中处理的任务。


“咦,搞这么多功能,不是会把 index.php 搞得很复杂吗?”


“不会的。只需要把各种功能写到单独的文件,然后在index.php里面include进来就可以了!”


可以看出,由于这些工作都被集中到了 index.php 来完成,可以减轻我们维护其他功能代码的难度。例如在10个文件中保持头部的几个include都一致可不是件让人愉快的事情。

 

单一入口应用程序的缺点

任何事情都有两面性,单一入口应用程序也不例外。由于所有 http 请求都是针对 index.php,所以应用程序的 url 看起来确实不那么美观。特别是对搜索引擎来说很不友好。


要解决这个问题,可以采用 URL 重写、PATHINFO 等方式。但我个人更推荐在前台页面不使用单一入口方式,而是保持多个文件入口。或者两者混用。例如新闻列表采用单独的 news.php 显示,而用户注册、发表信息等则采用单一入口。因为对于网站拥有者来说,新闻列表、新闻显示页面才是需要搜索引擎关注的高价值目标,而用户注册页面等交互性功能则根本没有收录的价值。
 

有朋友提到单一入口的应用程序会有很长一串参数,那么我们分析一下下面这个 url:

  1. index.php?url=list&page=2  


如果改为直接访问 news.php,也只不过省掉了 url=list 这一个参数而已。所以认为单一入口的应用程序 url 太复杂是没有道理的。