Heim  >  Artikel  >  PHP-Framework  >  Ausführliche Erklärung zur Verwendung von Lazy Collections zur Verbesserung der Leistung beim Lesen von Laravel Excel (unterstützt problemlos Millionen von Daten)

Ausführliche Erklärung zur Verwendung von Lazy Collections zur Verbesserung der Leistung beim Lesen von Laravel Excel (unterstützt problemlos Millionen von Daten)

藏色散人
藏色散人nach vorne
2020-03-21 08:56:492966Durchsuche

In Laravel 6 wurde eine neue Art von Sammlung hinzugefügt: Lazy Collections. Sie eignen sich hervorragend, wenn Sie sehr große Datensätze (Tausende oder Millionen Zeilen) verarbeiten müssen, ohne auf Speicherbeschränkungen zu stoßen.

Empfohlen: Laravel-Tutorial

Meine letzte Aufgabe bestand darin, den Excel-Export in einem Projekt bei der Arbeit umzugestalten. Das Problem besteht darin, dass der Export nicht mehr erstellt werden kann, da der Datensatz zu groß ist, als dass Laravel ihn verarbeiten könnte. Die Datenbankabfrage lieferte ca. 300.000 Ergebnisse! Bei der Anwendung tritt eine Zeitüberschreitung auf oder es ist ständig nicht mehr genügend Arbeitsspeicher vorhanden.

Ein naiver Ansatz besteht darin, das Timeout oder das Speicherlimit zu erhöhen und zu hoffen, dass das nächste Mal, wenn etwas schief geht, eine andere Person damit umgehen wird. Aber so arbeite ich nicht. Ich mag keine Pflaster. Ich mag konkrete, langfristige Lösungen.

Die Laravel Excel-Erweiterung ist bereits recht flexibel. Es leistet hervorragende Arbeit bei der Reduzierung der Datenbanklast durch die Verwendung von „Chunks“ bei der Verwendung von FromQuery-Anliegen. Unser Export hat jedoch immer noch Probleme mit großen Datensätzen.

Meine Kollegen und ich haben darüber gesprochen, ob wir diese Funktion komplett neu schreiben sollten: Den Export in eine Warteschlange verschieben und eine Benachrichtigung an den Benutzer senden, wenn der Export abgeschlossen ist. Allerdings ist diese Funktion in dieser App nur eine Nebensache. Es macht für uns keinen Sinn, nur für einen einfachen Export so viel Overhead hinzuzufügen.

Später an diesem Tag hatte ich einen kleinen „Heureka“-Moment, weil mir einfiel, dass Laravel LazyCollections hatte.

Ich habe den Export umgeschrieben: Er verwendet jetzt FromCollection-concern anstelle von FromQuery. Die einzige Änderung, die ich an der Methode „collection()“ vornehmen musste, bestand darin, die Methode „get()“ am Ende der Abfrage-Builder-Kette durch eine „cursor()“ zu ersetzen.

Nachfolgend finden Sie eine vereinfachte Version unserer Exportfunktion. Das Request-Objekt wird durch den Konstruktor geleitet, sodass wir die Abfrage basierend auf der Auswahl des Benutzers in der Benutzeroberfläche anpassen können.

<?php 
namespace App\Exports;
use App\User;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
use Illuminate\Http\Request;
class UsersExport implements FromCollection
{
    use Exportable;
    protected Request $request;
    public function __construct(Request $request)
    {
        $this->request = $request;
    }
    public function collection()
    {
        return User::query()
            ->when($this->request->get(&#39;include_subscribed&#39;), function ($q) {
                return $q->where(&#39;is_subscribed&#39;, true);
            })
            ->cursor(); // ← 重要的一点
    }
}

Ich glaube, dass bei Ihrem Projekt Speicherprobleme auftreten. Sie haben das Speicherlimit erhöht und damit hoffentlich das Problem gelöst (ich habe das selbst schon unzählige Male gemacht).

Wenn es in einem Laravel-Projekt wäre, könnte ich Sie hoffentlich bitten, diesen Code noch einmal zu überprüfen und ihn mit LazyCollections neu zu schreiben.

Die Behebung dieses Problems hat wirklich Spaß gemacht, deshalb habe ich einen kleinen Benchmark durchgeführt: Unser Export kann jetzt problemlos Millionen von Zeilen exportieren, ohne an Speichergrenzen zu stoßen. So cool!

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung zur Verwendung von Lazy Collections zur Verbesserung der Leistung beim Lesen von Laravel Excel (unterstützt problemlos Millionen von Daten). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen