我正试图构建一个自定义artisan命令,每天清理我的文件系统,这有几个步骤,我想不出一种不 destruct 内存的方法.有数千个文件夹和数十万用户.

我需要做的是;

  1. 获取所有超过50天的文件夹(基于下面的文件夹 struct )
  2. 从这些收集的文件夹中,查询用户id(即下面的嵌套文件夹名称),并判断数据是否已完成$user->isCompleted()
  3. 如果该用户数据已完成,则删除存储该用户数据的目录

在我的文件系统中,我根据日期存储了每个用户id的数据,所以文件系统看起来是这样的;

data/2022-01-15/7482947
data/2022-01-15/7482946
data/2022-01-15/7482945
data/2022-01-16/2353234
data/2022-01-16/2353233
data/2022-01-16/2353232

格式为;

data/<date>/<user_id>

到目前为止,我已经使用下面的代码返回了超过50天的文件夹,但我不确定如何继续获取嵌套文件夹,然后查询数据库

collect(Storage::directories('data/'))
  ->filter(function ($directory) {
    $directoryDate = Str::after($directory, '/');

    if (! Carbon::parse($directoryDate)->lte(now()->subDays(50))) {
      return false;
    }

    return true;
  });

任何帮助都将不胜感激.

推荐答案

  1. 获取所有超过50天的文件夹名称

  2. 从文件夹名称获取所有用户ID

  3. 用户是否完成签入DB

  4. 仅删除已完成的用户文件夹

     collect(Storage::directories('data/'))
     ->filter(function ($directory) {
         $directoryDate = Str::after($directory, '/');
    
         // check directory is older than 50 days
         if (Carbon::parse($directoryDate)->lte(now()->subDays(50))) {
             // get all user ids from directoryDate folder
             $userids = collect(Storage::directories('data/'.$directoryDate))
             ->map(function ($userDirectory) use ($directoryDate) {
                 return Str::after($userDirectory, 'data/'.$directoryDate.'/');
             });
             // check whether the user is completed or not. return only completed user ids onlys
             // instead using one query for one folder we are doing it in single query. it will reduce read operation in db
             $complete_duser_ids = User::where('is_complete',1)->wherein('id', $userids->all())->get()->pluck('id')->toArray();
    
             // delete the user folder who completed
             foreach ($complete_duser_ids as $completed_user) {
                 Storage::deleteDirectory('data/'.$directoryDate.'/'.$completed_user);
             }
         }
    
    
     });
    

我们正在获取所有用户文件夹ID,然后签入数据库.一旦我们得到要删除的信息,查询将只返回已完成的用户.您可以在计划作业(job)上使用此逻辑.

Php相关问答推荐

PHP Perl正则表达式—URL前面没有等号和可能的单引号或双引号

如何使用属性#[Embedded]嵌入带有规则的对象集合?

启用额外的WooCommerce产品库存位置

从WC会话变量更改WooCommerce checkout 托运方法成本

如何在php网站代码中清理浏览器缓存

只收取WooCommerce中最高的运费

在PHP 8.2 Gloogle云引擎上加载大型php文件速度缓慢

上传WordPress模板中的翻译文件(.mo和.po)

在WooCommercestore 页面上显示库存产品属性的值

dyld[45923]:未加载库:/usr/local/opt/libavif/lib/libavif.15dylib

添加产品标签以通过 WooCommerce 邮箱通知订购商品

循环中未序列化数组显示的问题

Google Sheets PHP API - 添加多个选项卡时出现问题

在 groupBy laravel 5.7 中 Select 多列

使用其ID查询和捕获与订单相关的其他详细信息的shopware 6方法

php如何删除括号内的百分比值

使用来自 PHP 表单的数据更新 xml 命名空间

Laravel 模型将日期保存为空

在 DomPDF 和 Laravel 中使用内联 css

Symfony 在将它传递给 Twig 时是否从数据库中获取整个对象?