阅读(1568) (0)

Laravel 8 简介

2021-07-01 16:46:27 更新

注意:在进一步学习 Laravel 的懒集合之前,我们先花点时间熟悉一下 PHP generators

为了补充已经很强大的 Collection 类, LazyCollection 类利用了 PHP 的 generators 来允许你在保持低内存使用率的同时使用非常大的数据集。

例如,假设你的应用需要处理一个千兆字节的日志文件,同时利用 Laravel 的集合方法来解析这个日志文件。与其一次将整个文件读入内存,不如使用懒集合在给定时间仅将文件的一小部分保留在内存中: 

use App\Models\LogEntry;
use Illuminate\Support\LazyCollection;

LazyCollection::make(function () {
    $handle = fopen('log.txt', 'r');

    while (($line = fgets($handle)) !== false) {
        yield $line;
    }
})->chunk(4)->map(function ($lines) {
    return LogEntry::fromLines($lines);
})->each(function (LogEntry $logEntry) {
    // Process the log entry...
}); 

或者,假设你需要遍历 10000 个 Eloquent 模型。当使用传统的 Laravel 集合时,全部 10000 个 Eloquent 模型必须同时加载到内存中:

$users = App\Models\User::all()->filter(function ($user) {
    return $user->id > 500;
}); 

然而,查询构建器的 cursor 方法返回一个 LazyCollection 实例。这允许你对数据库只进行一次查询, 而且一次只能在内存中加载一个 Eloquent 模型。在此例中, filter 回调只有在我们实际逐个迭代每个用户之后才会执行,这样可以大幅度减少内存使用:

$users = App\Models\User::cursor()->filter(function ($user) {
    return $user->id > 500;
});

foreach ($users as $user) {
    echo $user->id;
}