diff --git a/app/admin/view/system/config/site.html b/app/admin/view/system/config/site.html
index 372e71d..18404d7 100644
--- a/app/admin/view/system/config/site.html
+++ b/app/admin/view/system/config/site.html
@@ -42,6 +42,13 @@
填写版权信息。
+
diff --git a/app/common/command/Timer.php b/app/common/command/Timer.php
new file mode 100644
index 0000000..2284e75
--- /dev/null
+++ b/app/common/command/Timer.php
@@ -0,0 +1,115 @@
+setName('timer')
+ ->setDescription('内置秒级定时器');
+ }
+
+ protected function execute(Input $input, Output $output)
+ {
+ // 指令输出
+ $output->writeln('start timer');
+
+ $client = new Client([
+ 'base_uri' => sysconfig('site', 'site_domain'),
+ 'verify' => false,
+ ]);
+
+ while (true) {
+
+ try {
+
+
+ $config_list = include __DIR__ . '/timer/config.php';
+
+ $list_promises = [];
+ foreach ($config_list as $config_item) {
+
+ $config_item = static::initConfigItem($config_item);
+
+
+ $name = $config_item['name'];
+
+ $cache_key = 'timer_' . $name;
+ $cache_tag = 'system_timer';
+
+ $last_exec_time = Cache::get($cache_key, 0);
+
+ if ($last_exec_time >= time() - $config_item['frequency']) {
+ continue;
+ }
+
+ Cache::tag($cache_tag)->set($cache_key, time());
+
+ $type = $config_item['type'];
+
+ switch ($type) {
+ case 'site':
+ $output->writeln(date('Y-m-d H:i:s') . ': build site request async:' . $config_item['target']);
+ $list_promises[$config_item['name']] = $client->getAsync($config_item['target']);
+
+ break;
+
+ default:
+ $output->writeln(date('Y-m-d H:i:s') . 'unsupport type:' . $type);
+ break;
+ }
+ }
+
+ if (empty($list_promises)){
+
+ $output->writeln(date('Y-m-d H:i:s') . ' no request');
+ }else{
+ $results = Utils::unwrap($list_promises);
+ $output->writeln(date('Y-m-d H:i:s') . ': request all finished');
+ }
+ } catch (\Throwable $th) {
+ // throw $th;
+ $output->writeln('error:' . $th->getMessage());
+ Log::error($th->getMessage());
+ }
+
+
+
+
+
+ sleep(1);
+ }
+ }
+
+ private static function initConfigItem($config)
+ {
+ $default = [
+ 'name' => 'http_demo',
+ 'type' => 'site',
+ 'target' => '',
+ 'frequency' => 600
+ ];
+
+ $data = array_merge($default, $config);
+
+ if ($data['frequency'] < 1) {
+ $data['frequency'] = 1;
+ }
+
+ return $data;
+ }
+}
diff --git a/app/common/command/admin/ResetPassword.php b/app/common/command/admin/ResetPassword.php
index af1d948..3312c54 100644
--- a/app/common/command/admin/ResetPassword.php
+++ b/app/common/command/admin/ResetPassword.php
@@ -18,6 +18,7 @@ class ResetPassword extends Command
{
// 指令配置
$this->setName('admin:resetPassword')
+ ->addOption('password','p', Option::VALUE_OPTIONAL)
->setDescription('重置超管密码');
}
@@ -33,7 +34,12 @@ class ResetPassword extends Command
return false;
}
- $password = uniqid();
+ $password = $input->getOption('password');
+
+ if(is_null($password)){
+ $password = uniqid();
+ }
+
$model_admin->save([
'password' => password($password)
diff --git a/app/common/command/timer/config.php b/app/common/command/timer/config.php
new file mode 100644
index 0000000..ae5d2dd
--- /dev/null
+++ b/app/common/command/timer/config.php
@@ -0,0 +1,10 @@
+'http_demo', // 定时任务的名称,不能重複
+ 'type'=>'site', // 定时任务的类型,默认只支持site,你也可以重写定时器命令行以支持其他命令
+ 'target'=>'/tools/timer.ResetPassword/do', // 要访问的地址,如果不是以https开头,那么以后台的系统配置中读取相关配置,如果没有配置则不执行
+ 'frequency'=>600 // 执行频率,单位:秒,填写10,则每10秒过后执行一次
+ ]
+];
\ No newline at end of file
diff --git a/app/common/controller/ToolsController.php b/app/common/controller/ToolsController.php
new file mode 100644
index 0000000..aab4cdc
--- /dev/null
+++ b/app/common/controller/ToolsController.php
@@ -0,0 +1,11 @@
+fetch();
+ }
+}
diff --git a/composer.json b/composer.json
index 713b3af..afb2589 100644
--- a/composer.json
+++ b/composer.json
@@ -30,7 +30,8 @@
"jianyan74/php-excel": "^1.0",
"zhongshaofa/easy-admin": "^1.0.2",
"ext-json": "*",
- "zhongshaofa/thinkphp-log-trace": "^1.0"
+ "zhongshaofa/thinkphp-log-trace": "^1.0",
+ "guzzlehttp/guzzle": "^7.4"
},
"require-dev": {
"symfony/var-dumper": "^4.2",
diff --git a/composer.lock b/composer.lock
index f7b3560..0b25a09 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "6f1ec526803f2ecbe4f1486314294fdd",
+ "content-hash": "fdb5d3e361e1b400984f4ff47a15c98e",
"packages": [
{
"name": "adbario/php-dot-notation",
@@ -3380,7 +3380,6 @@
"require": {
"php": ">=7.0"
},
- "default-branch": true,
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3601,5 +3600,5 @@
"ext-json": "*"
},
"platform-dev": [],
- "plugin-api-version": "2.2.0"
+ "plugin-api-version": "1.1.0"
}
diff --git a/config/console.php b/config/console.php
index 1d60aed..a989b51 100644
--- a/config/console.php
+++ b/config/console.php
@@ -5,6 +5,7 @@
use app\common\command\admin\ResetPassword;
use app\common\command\Install;
+use app\common\command\Timer;
return [
// 指令定义
@@ -13,6 +14,7 @@ return [
'node' => 'app\common\command\Node',
'OssStatic' => 'app\common\command\OssStatic',
ResetPassword::class,
- Install::class
+ Install::class,
+ Timer::class,
],
];