ulthon_admin
欢迎
目录和文件规范
系统架构
命名规范
php-cs-fixer
public/static目录规范
app/common目录规范
command tools 规范
数据库规范
CURD
生成方案
CURD命令行
SCHEME机制
表结构
数据库迁移代码
CURD 命令使用指南与 Scheme 机制详解
最佳实践
数据库自动缓存
数据库调试
视图
包含文件
后台兼容接口请求
后台菜单导入导出
权限的用法
table数据表格
cols
operat
_if
auth
titleField
field
tab
edit
selectList
valueParser
trueHide
fieldFormat
templet
defaultValue
search相关
time
defaultSearchValue
size
defaultToolbar
init
formFullScreen
toobar
limit
modifyReload
控制器
CURD方法
导出
控制器通用验证
dataBrage向js传递参数
组件控件
select
下拉菜单option拼接
lay-submit
paste-text粘贴
multiple-columns
editor
data-upload上传
tag-input标签输入
property-input动态字段输入
data-date时间控件参数
table-data列表选择器
city-picker城市选择器
copy-text
全局监听组件
data-request
data-open
内置定时器
并发模式
重置密码
系统配置
PHP助手函数
sysconfig
JS助手函数
checkMobile
empty
open 弹框
叠加loading
getDataBrage
getQueryVariable
扩展机制
事件扩展
实现事件
执行事件
事件列表
AdminLayoutRequireAfter
LoadMigrationFiles
AdminLoginIndex
AdminLoginForget
AdminLoginType
AdminMenuTab
AdminLayoutRequireBefore
自动更新
性能优化
精简代码
关闭数据库日志驱动
皮肤
正常
科幻
其他
切换模块时直接切换内容
关闭上传文件注入检测
代码编译原理
接入workerman和命令参数
升级TP6.1
Request的默认过滤
异步引入全局script
线上安装脚本
兼容PHP8.1
内置定时器
系统内置了一个秒级定时器功能:
- 运行方式
php think timer
这个命令应当被守护进程守护后台运行
开发方式
在定时任务配置中填写配置,其中要填写访问的地址,比如说本站的一个控制器方法,然后把逻辑写道控制其中。
配置
打开定时器配置文件:app/common/command/timer/config.php,
注意这个文件并不在
config目录下
内容如下:系统内置了一个定时器demo
<?php
return [
[
'name'=>'http_demo', // 定时任务的名称,不能重複
'type'=>'site', // 定时任务的类型,默认只支持site,你也可以重写定时器命令行以支持其他命令
'target'=>'/tools/timer.ResetPassword/do', // 要访问的地址,如果不是以https开头,那么以后台的系统配置中读取相关配置,如果没有配置则不执行
'frequency'=>600 // 执行频率,单位:秒,填写10,则每10秒过后执行一次
]
];
以上配置表示每过10分钟请求一次url,在本案例中请求的地址是:
http://admin.demo.ulthon.com/tools/timer.ResetPassword/do
案例中的重置密码功能只有在演示模式下才能使用
使用定时器需要现在系统配置中设置站点域名:

这时你可以在tools应用下新建你自己的控制器了,这样每秒都会被请求。
这些请求在这一次定时任务中是异步执行的,具体请参考 guuzle的异步请求,一般来讲延迟是执行最长的那次请求,比如有三个请求,前两个1秒就执行完了,第三个执行了3秒,那么这次定时任务会持续3秒。
定时任务每次都是阻塞的,也就是说你的定时任务业务不会出现并发的情况,除非把同一个请求地址配置了两次,具体可以看一下定时器的源码。
这样的定时任务好处:
- 不会出现并发情况
- 定时任务的业务逻辑随时更新(控制器的代码随时可修改)
这样的定时任务并不是每秒执行,最终的频率一般是1秒+执行耗时
定时器的控制器
定时器会以http的方式发起请求,所以我们写一个标准的控制器即可,但是为了更健全的功能,我们应当做一个防刷机制,可以参考系统中的案例,继承TimerController.php,它提供了一个简单防刷机制。
<?php
declare(strict_types=1);
namespace app\tools\controller\timer;
use app\common\controller\TimerController;
use think\facade\Console;
class ResetPassword extends TimerController
{
protected $frequency = 600; // 只要定义一个属性即可。
public function do()
{
if (!env('adminsystem.is_demo', false)) {
return $this->error('本功能只有在演示环境下在能使用', '', '/');
}
$output = Console::call('admin:resetPassword', [
'--password=123456'
]);
return $output->fetch();
}
}
一般的只要定义frequency属性即可,如果不定义或者不是数字,则不会不执行防刷检测,这时你可以手动调用防刷检测:
$this->protectVisit(600);
定制
在配置项中预留了一些配置项,如比type,你可以自定义它,然后按照你自己的业务去处理,比如执行一个command,或者执行一个函数,实例化一个类。
$type = $config_item['type'];
switch ($type) {
case 'site':
'''默认逻辑'''
break;
default:
$output->writeln(date('Y-m-d H:i:s') . 'unsupport type:' . $type);
break;
}
2.x