如何使用 Laravel 读取目录中的所有文件内容

how to read all file contents in a directory with Laravel

我在一个目录中有很多文件,我想读取所有文件并将它们保存在数据库中。 我知道该怎么做,但我知道的方式是所有文件内容将同时加载到内存中,Web 应用程序将停止运行。我倾向于设置一些限制,比如它同时读取 300 个文件,然后再读取下 300 个文件。 如您所见,我这里有 736 个文件。

这是我的样本文件内容:

我正在使用此代码拆分它们。

    foreach ($contents as $content) {
        $slice = preg_split("/\r\n|\r|\n/", $content);
    }

结果:

您可以使用 laravel 的 filesytem 和 Storage facade 来实现:

$files = Storage::disk('public')->files('path/to/files');

foreach ($files as $file) {
    $contents = Storage::disk('public')->get($file);
    // Save contents to DB;
}

您也可以通过构建内容数组来分批完成它们

$files = Storage::disk('public')->files('path/to/files');
$contents = [];
$toMove = [];

foreach ($files as $file) {
    $content = Storage::disk('public')->get($file);
    $slice = preg_split("/\r\n|\r|\n/", $content);
    
    $contents[] = [
         'metadata' => $slice[0],
         'data1' => $slice[1],
         'data2' => $slice[2],
         'data3' => $slice[3],
    ];
    
    $toMove[] = $file;

    if (count($contents) === 10) {
        DB::table('informations')->insert($contents);

        foreach($toMove as $file) {
            Storage::disk('public')
                ->move($file , 'done/'.Str::of($file)->after('/')); 
        }

        $contents = [];
        $toMove = [];
    }
}

if (count($contents)) {
    DB::table('informations')->insert($contents);

    foreach($toMove as $file) {
        Storage::disk('public')
            ->move($file , 'done/'.Str::of($file)->after('/')); 
    }
}