首页 > 其他分享 >[后续更新中] DeerOJ的工作原理

[后续更新中] DeerOJ的工作原理

时间:2024-05-30 19:34:35浏览次数:26  
标签:后续 lib DeerOJ route 更新 uoj requirePHPLib php 路由

服务端收到请求后,会运行 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;
});

这里是动态调用库文件,主要是根据用户的网页请求来调用。比如申请主页,会调用 controllersindex.php 文件。

标签:后续,lib,DeerOJ,route,更新,uoj,requirePHPLib,php,路由
From: https://www.cnblogs.com/hakurokawashiro/p/18223090

相关文章

  • DeerOJ的前端框架介绍-Web文件夹和App文件夹(route.php)
    Web文件夹下的结构DeerOJ的前端框架参考了部分Lavarel框架,做到兼顾代码的可维护性和可阅读性。具体的维护目录文件结构如下:注意到web文件夹下的index.php这是整个前端程序的main程序,当服务段收到请求后,根据.htaccess文件指定使用index.php文件来生成网页,并把网页数......
  • DeerOJ的前端框架介绍-config.php
    config.php文件config.php文件是PHP应用程序的配置文件,具体用于DeerOnlineJudge(DeerOJ)系统的设置。它定义了应用程序的基本信息、数据库连接、Web服务器设置、安全配置、邮件配置、评测机配置以及一些开关设置。基本信息(profile)部分参数解释如下:oj-name:在线......
  • [持续更新中] 创新实训项目
    DeerOJ的前端框架介绍Web文件夹下的结构DeerOJ的前端框架参考了部分Lavarel框架,做到兼顾代码的可维护性和可阅读性。具体的维护目录文件结构如下:注意到web文件夹下的index.php这是整个前端程序的main程序,当服务段收到请求后,根据.htaccess文件指定使用index.php文......
  • 监听浏览器更新URL参数,实现伪SPA单页面应用
    在老的jqury项目中通常实现SPA一般都采用hash值变化来进行监听,但是有的项目中我们也想采用改变URL参数来进行监听,一般我们使用window.history.pushState方法来改变url参数;为了在使用window.history.pushState或window.history.replaceState后能够检测到浏览器的后退按钮操作,......
  • 【持续更新】创新实训
    项目简介随着互联网+的生态模式和人工智能的产业化发展,程序设计已成为计算机专业乃至工科学生的必备技能之一。学生学习程序设计,不仅能提高代码水平能力,学会如何写代码,如何写好代码,而且能锻炼学生在今后面对项目开发等实际应用场景时解决问题的能力。因此,很多同学在刚刚接触到编......
  • 是否有办法区分 Mac App Store 应用程序的重新安装和更新?
    我正在开发一款电子应用,并将其发布到MacAppStore。我的主要目标是在应用卸载(和重新安装)时清除应用创建的用户数据,而不是在更新时。但是这在MacOS上是不可能实现的,因为在MacOS上卸载只是将应用文件夹拖入垃圾箱,而垃圾箱是无法干预的。因此,我转而尝试在应用从全新安装中首次......
  • 对于一个页面的两个更新方法,我们到底该写成一个通用的还是两个单独的?
    如果一个页面有两个更新方法的话,分别是通过不同的功能点点击过去的,比如分别更新一个页面的上半部分内容(业务实体A),一个是只是更新其中的发票信息的(发票实体B),虽然在一个页面,但是也不应该写成一个更新请求这种的因为两个更新没什么关联的关系,而且更新的是实体不是一个,所以就可以整成......
  • lua语言:模块热更新方案
    我们知道,lua通过package模块来管理模块的搜索和加载,当使用require首次成功加载一个模块后,模块(Table)会被存储在package.loaded中,之后的require行为会直接获取到已加载的模块缓存。如何在程序执行时,将对模块文件的修改热更新到程序中,同时确保运行时状态的正常。这是项目开发中常见......
  • MySQL约束条件,非空空约束(not nullnull),主键约束PK(primary key),外键约束FK(foreign key
    ⅠMySQL约束条件【一】什么是约束条件约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!约束条件在创建表时可以使用,也可以修改表的时候添加约束条件【二】约束条件概览null和notnull为空和不为空限制整数类型必须大......
  • 【python007】读取csv文件url多进程下载图片数据(最近更新中)
    1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!3.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!4.欢迎点赞、关注、批评、指正,互三走起来,小手动起来!......