Ich stoße auf ein Problem, bei dem meine Datenbankaufrufe die Seitenbelastung erheblich verlangsamen. Ich beziehe mehrere Diagramme aus den Daten der Wahlen, und meine Tabelle enthält rund 1 Million Zeilen, und ich muss diese Daten mehrmals in jeder Methode innerhalb der getCharts()
Methode abfragen.Multi-Threading in Laravel
Ich bin using this, um die Rückgabedaten an JavaScript zu übergeben.
Diese Diagramme werden beim Klicken auf einen Datenpunkt erneut ausgefüllt. Wenn Sie also auf einen Punkt klicken ("Demokrat"), wird die Seite neu geladen und diese Methoden erneut aufgerufen.
Was ich fragen ist, ob es möglich ist, so etwas in nativem PHP zu tun. Der Server läuft PHP 5.2 auf Linux.
foreach(function in getChartsMethod){
Start a child thread to process the function.
}
join the threads.
reload the page.
public function getCharts(){
$this->get_cast_chart();
$this->get_party_chart();
$this->get_gender_chart();
$this->get_age_chart();
$this->get_race_chart();
$this->get_ballot_chart();
$this->get_county_chart();
$this->get_precinct_chart();
$this->get_congressional_district_chart();
$this->get_senate_district_chart();
$this->get_house_district_chart();
return view('elections.index');
}
Probenmethode
public function get_party_chart(){
$query = DB::table($this->tableName)
->select('party', DB::raw('count(*) as numVotes'))
->groupBy('party')
->orderBy('numVotes', 'ASC');
if ($this->filterParameters != null){
$query = $query->where(key($this->filterParameters), $this->operator, current($this->filterParameters));
}
$chartData = $query->get();
$chartData = $this->prepare_data_for_chart($chartData, 'party', 'numVotes');
JavaScript::put(['partyChart' => $chartData]);
}
Die Tabellengrößen sind ungefähr 1 Million Zeilen und alle diese Diagramme zeigen die Anzahl der Stimmen. Grob gesagt, der einzige Unterschied ist, wie ich sie gruppiere (showVotes nach Geschlecht, Party, Alter, etc ..). Diese Daten werden jeden Tag für drei Monate bis zum Ende des Wahltages hochgeladen/aktualisiert und danach gibt es keine Änderungen. Das Problem mit dem Scheduler ist, dass ich viele Aufgaben im Hintergrund ausführen muss, da es viele Variationen dieser Daten gibt. Wenn Sie auf Alter 60 klicken, wird die Seite mit den Wahldaten nur für 60 Jahre neu geladen. –
Wenn Sie die Daten filtern, um beispielsweise "60 Jahre alt" zu sagen, sollte der Datensatz nicht mehr zu groß sein, und Sie können immer noch Server-Normalisierung durchführen, um ein viel kleineres Datenpaket an das Frontend zu senden. Wieder ist es sehr schwer, diese Frage zu beantworten, da es sehr breit ist und vom Kontext abhängt. – Chris
danke. Was denkst du über die Verwendung von Scheduler und https://laravel.com/docs/5.1/cache, um die Daten vorzuspeichern und zu leeren, wenn die Daten hochgeladen werden? Ich denke, ich bin ein wenig verwirrt darüber, wie man die erste Seite schnell laden kann. –