Laravel删除超50天日期命名目录 代码无报错不生效排查
问题排查结论
你的代码没有生效的核心原因是路径取值和字符串比较逻辑不符合预期:
Storage::directories('collections/')返回的结果是带父路径前缀的完整相对路径,格式为collections/2022-01-14,而非你预期的纯日期字符串2022-01-14- 字符串比较按字符ASCII码逐位对比,路径字符串首字符是小写字母
c(ASCII码99),用来对比的阈值日期首字符是数字2(ASCII码50),因此$directory < 阈值日期的判断永远返回false,删除逻辑块从未执行,自然不会有报错也不会有删除效果 - 补充说明:
Y-m-d格式的日期字符串字典序和时间先后顺序完全一致,你用字符串比较判断日期先后的思路本身是可行的。
正确实现代码
轻量版(直接字符串比较,性能更好)
提前计算阈值日期,提取路径末尾的纯日期名做比较,增加格式校验避免误删:
<?php // 提前计算截止日期,避免循环内重复执行 $expireBefore = now()->subDays(50)->format('Y-m-d'); collect(Storage::directories('collections/')) ->each(function ($dir) use ($expireBefore) { $dirName = basename($dir); // 仅处理符合Y-m-d命名格式的文件夹,跳过其他无关目录 if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dirName) && $dirName < $expireBefore) { Storage::deleteDirectory($dir); } });
稳妥版(Carbon日期解析,容错性更高)
如果担心文件名格式有异常,可以用Carbon解析日期后做比较,自动跳过非日期命名的目录:
<?php $expireBefore = now()->subDays(50); collect(Storage::directories('collections/')) ->each(function ($dir) use ($expireBefore) { $dirName = basename($dir); try { $dirDate = \Carbon\Carbon::createFromFormat('Y-m-d', $dirName); if ($dirDate->lte($expireBefore)) { Storage::deleteDirectory($dir); } } catch (\Carbon\Exceptions\InvalidFormatException $e) { // 非日期格式目录直接跳过 return; } });
注意事项
正式运行删除逻辑前,建议先把Storage::deleteDirectory($dir)替换为info("待删除: {$dir}")做空跑测试,确认列出的所有目录都符合过期规则,再执行实际删除操作,避免误删文件。
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

