2016-04-25 13 views
3

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]); 

    } 

Antwort

2

Multithreading ist möglich in PHP, die zuvor auf Stackoverflow diskutiert wurde: How can one use multi threading in PHP applications

jedoch, wie viel ich weiß nicht, Multithreading Sie helfen hier. Wie viele Daten sprechen wir, welche Art von Genauigkeit suchen Sie in den Charts? Wie viele Diagramme werden angezeigt? Ein Großteil der Lösung wird aus dem Kontext kommen.

Wenn ich es wäre, hätte ich einen Hintergrund schedule Vorverarbeitung der "großen" Datenmengen in etwas nützlicheres/verwendbar am Frontend. Wieder nützlich/brauchbar sind ausschließlich die Zusammenhänge. Wenn eine tatsächliche Seitenanforderung vorliegt, müssen Sie nur die verarbeiteten Daten im Gegensatz zu tatsächlichen "Live" -Daten übergeben.

Auch dies hängt wiederum vom Kontext Ihrer Anwendung ab. Vielleicht brauchen Sie minutengenaue Daten, vielleicht nicht.

+0

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. –

+0

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

+0

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. –

2

Chris hat Recht - es hängt alles von Ihrer Anwendung ab, aber wenn Sie zu dem Punkt kommen, an dem die Anwendung nicht nutzbar ist, sollten Sie Ihre Ergebnisse in redis oder memcached einlösen.