dootask/tests/manual/chunk_cleanup_smoke.php
kuaifan 184fb27680 feat(upload): 分片上传统一链路,5 场景突破单文件 1G 限制
- 新增 api/upload/{init,chunk,merge} 入口与 ChunkUpload 模块(5MB 分片、3 并发、Redis 状态机)
- 5 场景接入:文件柜 / 聊天 / 任务附件 / 头像&系统图片 / 编辑器粘贴
- 秒传:同用户同 hash 复用 FileContent 物理文件,零传输
- 续传:Redis + localStorage 双索引,24h TTL
- 与老接口对齐:pid 锁、≤300 上限、webkit_relative_path 目录递归、overwrite 替换语义
- init 阶段读 file_upload_limit 拦截超限,避免传完分片才报错
- DeleteTmpTask 加 tmp_chunks case 兜底清理 24h 未合并目录
- files 表新增 hash 列(migration)
- 前端 chunkedUpload wrapper:主线程 spark-md5 流式 + 指数退避重试
- ai-kb 同步:upload / file-upload-limit / upload-size-limit 三个 chunk
2026-06-30 04:30:09 +00:00

41 lines
1.3 KiB
PHP

<?php
/**
* 验证 DeleteTmpTask::tmp_chunks 清理逻辑。
* docker exec dootask-php-3bed84 php /var/www/tests/manual/chunk_cleanup_smoke.php
*/
require '/var/www/vendor/autoload.php';
$app = require_once '/var/www/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
use App\Tasks\DeleteTmpTask;
function out(string $m): void { echo "[" . date('H:i:s') . "] $m\n"; }
function fail(string $m): void { out("FAIL: $m"); exit(1); }
$root = public_path('uploads/tmp/chunks');
@mkdir("$root/9999/old_session", 0775, true);
@mkdir("$root/9999/new_session", 0775, true);
file_put_contents("$root/9999/old_session/0", 'old');
file_put_contents("$root/9999/new_session/0", 'new');
// 把 old_session 的 mtime 改成 25 小时前
$past = time() - 3600 * 25;
touch("$root/9999/old_session", $past);
touch("$root/9999/old_session/0", $past);
$task = new DeleteTmpTask('tmp_chunks', 24);
$task->start();
if (is_dir("$root/9999/old_session")) {
fail('old_session 应被清理但仍在');
}
if (!is_dir("$root/9999/new_session")) {
fail('new_session 不应被清理却被删');
}
out('OK: old_session 清掉 / new_session 保留');
// 清理测试残留
exec("rm -rf " . escapeshellarg("$root/9999"));
out('=== 通过 ===');