服务端收到请求后,会运行 web
文件夹下的 index.php
文件(由同目录下的.htaccess
决定)
index.php
文件的内容截图如下:
index.php
会加载所需的函数库和类库,具体如下:
require $_SERVER['DOCUMENT_ROOT'] . '/app/libs/uoj-lib.php';
该句是调用 /app/libs/
下的php文件,用来调用一些类和方法。
uoj-lib.php
的完整代码如下:
注意到 uoj-lib.php
下有如下代码段:
function requirePHPLib($name) { // uoj php lib
require $_SERVER['DOCUMENT_ROOT'].'/app/libs/uoj-'.$name.'-lib.php';
}
requirePHPLib('validate');
requirePHPLib('query');
requirePHPLib('rand');
requirePHPLib('utility');
requirePHPLib('security');
requirePHPLib('contest');
requirePHPLib('html');
可知在代码中调用了同类文件夹的其他 lib.php
文件,这些文件的具体功能大致如下:
validate
:验证lib,用来验证某些信息是否合法,比如账号密码等query
:查询lib,用来调用后台数据库查询相关信息,结合model
文件夹下的DB.php
类使用rand
:随机lib,用来生成随机数据(随机数、随机文件名等)utility
:utility—lib,用来实现一些在web上的功能,比如配置合并,字符串处理等security
:安全lib,用来维护账号的安全,比如密码处理,token等contest
:比赛lib,用来处理比赛相关的方法集,比如计算rating,更新人数等html
:HTMLlib,用来接收网页相关信息、输出html代码等
注意到 uoj-lib.php
下有如下代码段:
Session::init();
UOJTime::init();
DB::init();
Auth::init();
if (isset($_GET['locale'])) {
UOJLocale::setLocale($_GET['locale']);
}
UOJLocale::requireModule('basic');
此段均是对 /app/models/
下的部分类进行初始化,其中:
Session
:初始化会话层相关的信息UOJTime
:初始化时间信息DB
:初始化和数据库的连接Auth
:初始化登录用户的信息UOJLocale
:中英文相关的配置信息
回到web
文件夹下的 index.php
文件,注意到如下代码:
require UOJContext::documentRoot().'/app/route.php';
其中,UOJContext
类是用来管理和获取与当前Web请求相关的上下文信息,例如获取服务器环境信息,blog处理等。该句是调用路由文件。路由文件(route file) 去给请求中的网址匹配用于生成响应报文的 PHP 代码,结合 models
下的 Route
使用。 Route
定义了一个简单的路由系统,允许通过静态方法定义和管理路由。通过 match、get、post 等方法,可以方便地为不同的HTTP请求方法定义路由。通过 group 方法,可以对一组路由应用共同的属性。dispatch 方法用于遍历和匹配请求的路由,并执行相应的操作。整个路由系统利用静态属性和方法来管理路由,使其在应用中便于使用和扩展。
index.php
文件中,注意到如下代码:
include UOJContext::documentRoot().'/app/controllers'.call_user_func(function() {
$route = Route::dispatch();
$q_pos = strpos($route['action'], '?');
if ($q_pos === false) {
$path = $route['action'];
} else {
parse_str(substr($route['action'], $q_pos + 1), $vars);
$_GET += $vars;
$path = substr($route['action'], 0, $q_pos);
}
if (isset($route['onload'])) {
call_user_func($route['onload']);
}
return $path;
});
这里是动态调用库文件,主要是根据用户的网页请求来调用。比如申请主页,会调用 controllers
的 index.php
文件。