一、目录结构
project 应用部署目录
├─application 应用目录(可设置)
│ ├─common 公共模块目录(可更改)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块函数文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ ├─view 视图目录
│ │ └─ ... 更多类库目录
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共(函数)文件
│ ├─config.php 应用(公共)配置文件
│ ├─database.php 数据库配置文件
│ ├─tags.php 应用行为扩展定义文件
│ └─route.php 路由配置文件
├─extend 扩展类库目录(可定义)
├─public WEB 部署目录(对外访问目录)
│ ├─static 静态资源存放目录(css,js,image)
│ ├─index.php 应用入口文件
│ ├─router.php 快速测试文件
│ └─.htaccess 用于 apache 的重写
├─runtime 应用的运行时目录(可写,可设置)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think Think 类库包目录
│ │ └─traits 系统 Traits 目录
│ ├─tpl 系统模板目录
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 基础定义文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
├─build.php 自动生成定义文件(参考)
├─composer.json composer 定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行入口文件
二、生命周期
- 加载入口文件
- 执行框架引导文件
- 注册自动加载机制
- 注册错误和异常机制
- 应用初始化
- URL访问检测
- 路由检测
- 分发请求
- 响应输出
- 应用结束
三、开发规范
TP5遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:
目录和文件
- 目录使用小写+下划线
- 类库、函数文件统一以.php为后缀
- 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致
- 类文件采用首字母大写的驼峰法命名,其他文件采用小写+下划线命名
- 类名和类文件名保持一致,统一采用首字母大写的驼峰法命名
函数和属性命名
- 函数的命名使用小写字母+下划线的方式,例如get_client_ip
- 方法的命名使用首字母小写的驼峰法,例如getUserName
- 属性的命名使用首字母小写的驼峰法,例如tableName、instance
- 以双下划线__打头的函数或方法作为魔术方法,例如__call和__autoload
常量和配置
- 常量以大写字母+下划线命名,例如APP_PATH和THINK_PATH
- 配置参数以小写字母+下划线命名,例如url_route_on和url_convert
数据表和字段
- 数据表和字段采用小写+下划线方式命名,并注意字段名不要以下划线开头,例如think_user表和user_name字段,不建议使用驼峰和中文作为数据表字段命名
四、入口文件
ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个应用都有一个统一(但不一定唯一)的入口。
所有的应用都是从入口文件开始的,并且不同应用的入口文件是类似的。
入口文件的作用:
- 定义框架路径、项目路径(可选)
- 定义系统相关常量(可选)
- 载入框架入口文件(必须)
TP5默认的应用入口文件位于public/index.php,内容如下:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php'
入口文件的设计是为了让应用部署更安全,public目录为web根目录,其他文件都应放到非web访问目录下面。
修改入口文件位置
我们也可以通过修改入口 文件的位置及内容,将入口文件改到根目录下面:
// 应用目录
define('APP_PATH', __DIR__.'/apps/');
// 加载框架引导文件
require './thinkphp/start.php';
这样最终的应用目录结构如下:
www WEB部署目录(或者子目录)
├─index.php 应用入口文件
├─apps 应用目录
└─think 框架目录
linux系统下部署
部分 Linux 主机设置了 open_basedir(可将用户访问文件的活动范围限制在指定的区域,通常是入口文件根目录的路径) 选项,导致 ThinkPHP5 访问白屏或者报错:
这种情况下,需要把权限作用域由入口文件目录修改为框架根目录,打开php.ini(php.ini 文件通常是在 /usr/local/php/etc 目录中,当然了这取决于环境配置)搜索open_basedir,把
open_basedir = "/home/wwwroot/tp5/public/:/tmp/:/var/tmp/:/proc/"
修改为:
open_basedir = "/home/wwwroot/tp5/:/tmp/:/var/tmp/:/proc/"
如果php.ini文件的open_basedir设置选项是被注释的或者为none,那么需要通过修改apache或nginx来实现
apache修改方法:
Apache 需要修改 httpd.conf 或者同目录下的 vhost 目录下域名.conf 文件,如果是 LAMP 一键安装包配置那么多半就是直接修改域名.conf 文件
打开域名.conf 文件搜索 open_basedir,把
php_admin_value open_basedir "/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/var/tmp/:/proc/"
修改为
php_admin_value open_basedir "/home/wwwroot/www.thinkphp.cn/:/tmp/:/var/tmp/:/proc/"
然后重新启动 apache 即可生效
nginx修改方法:
Nginx 需要修改 nginx.conf 或者 conf/vhost 目录下域名.conf 文件,如果LNMP/LTMP一键安装包配置那么多半就是直接修改域名.conf 文件
打开域名.conf 文件 搜索 open_basedir,把
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/proc/";
修改为
fastcgi_param PHP_VALUE "open_basedir=/home/wwwroot/www.thinkphp.cn/:/tmp/:/proc/";
然后重新启动 Nginx 即可生效
fpm/fastcgi user.ini 修改方法:
打开 项目根目录下找到 user.ini 文件,搜索 open_basedir,把
open_basedir=/home/wwwroot/www.thinkphp.cn/public/:/tmp/:/proc/
修改为
open_basedir=/home/wwwroot/www.thinkphp.cn/:/tmp/:/proc/
然后重新启动 web 服务器 即可生效
.htaccess文件解读
隐藏入口文件
<IfModule mod_rewrite.c>
Options + FollowSymlinks -Multiviews
RewriteEngine On #开启rewriteEngine模块
RewriteCond %{REQUEST_FILENAME} !-d #!-d不是目录或目录不存在
RewriteCond %{REQUEST_FILENAME} !-f #不是文件或文件不存在
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] #转给index.php处理,并将其后的参数作为index.php的参数传递给它[L]这是最后一个匹配项,不再往下匹配
</IfModule>