Laravel 中的多线程

问题描述 投票:0回答:3

我遇到了一个问题,我的数据库调用显着减慢了页面加载速度。我正在从选举数据填充多个图表,我的表包含大约 100 万行,我必须在

getCharts()
方法内的每个方法中多次查询此数据。

我正在使用this将返回数据传递给JavaScript。

当您单击数据点时,这些图表会重新填充。因此,如果您单击一个点,即(“民主”),它将重新加载页面并再次调用这些方法。

我想问的是是否可以在原生 PHP 中做这样的事情。服务器在 linode 上运行 PHP 5.2。

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');
    }

示例方法

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

    }
php multithreading laravel asynchronous laravel-queue
3个回答
6
投票

PHP 中可以实现多线程,之前在 Stackoverflow 上已经讨论过:如何在 PHP 应用程序中使用多线程

但是我不知道多线程在这里能帮到你多少。我们谈论了多少数据,您在图表中寻找什么样的准确性?显示了多少个图表?很多解决方案都来自于上下文。

如果是我,我会有一个后台时间表将“大量”数据预处理为前端更有用/可用的东西。同样,有用/可用完全取决于上下文。当存在实际页面请求时,您只需要传递处理后的数据,而不是实际的“实时”数据。

再次强调,这完全取决于您的应用程序的上下文。也许您需要实时数据,也许不需要。


3
投票

Chris 是对的 - 这一切都取决于您的应用程序,但是如果您已经到了应用程序无法使用的地步,您应该考虑将结果兑现到 redis 或 memcached 中。


0
投票

在 laravel 10 中你可以使用 进程交互

进程甚至可以在池中启动,以方便 并发进程的执行和管理

use Illuminate\Process\Pool;
use Illuminate\Support\Facades\Process;

[$first, $second, $third] = Process::concurrently(function (Pool $pool) {
   $pool->command('cat first.txt');
   $pool->command('cat second.txt');
   $pool->command('cat third.txt');
});

return $first->output();
© www.soinside.com 2019 - 2024. All rights reserved.