perf: 自动清空文件回收站

This commit is contained in:
kuaifan 2023-03-25 23:25:50 +08:00
parent 01bb72523e
commit 160c736b38
4 changed files with 74 additions and 8 deletions

View File

@ -193,7 +193,8 @@ class IndexController extends InvokeController
// 删除过期的临时表数据 // 删除过期的临时表数据
Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1)); Task::deliver(new DeleteTmpTask('wg_tmp_msgs', 1));
Task::deliver(new DeleteTmpTask('task_worker', 12)); Task::deliver(new DeleteTmpTask('task_worker', 12));
Task::deliver(new DeleteTmpTask('tmp', 24)); Task::deliver(new DeleteTmpTask('tmp'));
Task::deliver(new DeleteTmpTask('file'));
// 删除机器人消息 // 删除机器人消息
Task::deliver(new DeleteBotMsgTask()); Task::deliver(new DeleteBotMsgTask());
// 周期任务 // 周期任务

View File

@ -287,6 +287,27 @@ class File extends AbstractModel
return true; return true;
} }
/**
* 强制删除文件
* @return true
*/
public function forceDeleteFile()
{
AbstractModel::transaction(function () {
$this->forceDelete();
FileContent::withTrashed()
->whereFid($this->id)
->orderBy('id')
->chunk(500, function ($contents) {
/** @var FileContent $content */
foreach ($contents as $content) {
$content->forceDeleteContent();
}
});
});
return true;
}
/** /**
* 获取文件分享链接 * 获取文件分享链接
* @param $userid * @param $userid

View File

@ -39,6 +39,22 @@ class FileContent extends AbstractModel
{ {
use SoftDeletes; use SoftDeletes;
/**
* 强制删除文件内容
* @return void
*/
public function forceDeleteContent()
{
$this->forceDelete();
$content = Base::json2array($this->content ?: []);
if (str_starts_with($content['url'], 'uploads/')) {
$path = public_path($content['url']);
if (file_exists($path)) {
@unlink($path);
}
}
}
/** /**
* 转预览地址 * 转预览地址
* @param array $array * @param array $array

View File

@ -2,6 +2,7 @@
namespace App\Tasks; namespace App\Tasks;
use App\Models\File;
use App\Models\TaskWorker; use App\Models\TaskWorker;
use App\Models\Tmp; use App\Models\Tmp;
use App\Models\WebSocketTmpMsg; use App\Models\WebSocketTmpMsg;
@ -17,7 +18,11 @@ class DeleteTmpTask extends AbstractTask
protected $data; protected $data;
protected $hours; // 多久后删除,单位小时 protected $hours; // 多久后删除,单位小时
public function __construct(string $data, int $hours) /**
* @param string $data
* @param int $hours
*/
public function __construct(string $data, int $hours = 24)
{ {
parent::__construct(...func_get_args()); parent::__construct(...func_get_args());
$this->data = $data; $this->data = $data;
@ -28,13 +33,14 @@ class DeleteTmpTask extends AbstractTask
{ {
switch ($this->data) { switch ($this->data) {
/** /**
* 表pre_wg_tmp_msgs * 表pre_tmp_msgs
*/ */
case 'wg_tmp_msgs': case 'wg_tmp_msgs':
{ {
WebSocketTmpMsg::where('created_at', '<', Carbon::now()->subHours($this->hours)->toDateTimeString()) WebSocketTmpMsg::where('created_at', '<', Carbon::now()->subHours($this->hours))
->orderBy('id') ->orderBy('id')
->chunk(500, function ($msgs) { ->chunk(500, function ($msgs) {
/** @var WebSocketTmpMsg $msg */
foreach ($msgs as $msg) { foreach ($msgs as $msg) {
$msg->delete(); $msg->delete();
} }
@ -43,13 +49,14 @@ class DeleteTmpTask extends AbstractTask
break; break;
/** /**
* 表pre_wg_tmp * 表pre_tmp
*/ */
case 'tmp': case 'tmp':
{ {
Tmp::where('created_at', '<', Carbon::now()->subHours($this->hours)->toDateTimeString()) Tmp::where('created_at', '<', Carbon::now()->subHours($this->hours))
->orderBy('id') ->orderBy('id')
->chunk(2000, function ($tmps) { ->chunk(500, function ($tmps) {
/** @var Tmp $tmp */
foreach ($tmps as $tmp) { foreach ($tmps as $tmp) {
$tmp->delete(); $tmp->delete();
} }
@ -63,11 +70,32 @@ class DeleteTmpTask extends AbstractTask
case 'task_worker': case 'task_worker':
{ {
TaskWorker::onlyTrashed() TaskWorker::onlyTrashed()
->where('deleted_at', '<', Carbon::now()->subHours($this->hours)->toDateTimeString()) ->where('deleted_at', '<', Carbon::now()->subHours($this->hours))
->orderBy('id') ->orderBy('id')
->forceDelete(); ->forceDelete();
} }
break; break;
/**
* 表pre_file
*/
case 'file':
{
$day = intval(env("AUTO_EMPTY_FILE_RECYCLE", 365));
if ($day <= 0) {
return;
}
File::onlyTrashed()
->where('deleted_at', '<', Carbon::now()->addDays($day))
->orderBy('id')
->chunk(500, function ($files) {
/** @var File $file */
foreach ($files as $file) {
$file->forceDeleteFile();
}
});
}
break;
} }
} }