Laravel 8 简介
注意:在进一步学习 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;
}