获取HttpKernel对url的响应,并行化

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

我正在使用https://github.com/JosephSilber/page-cache来缓存页面。为了预先准备页面(大约100,000),我曾经通过GuzzleHttp并行运行8个http请求。它有效,但由于开销很慢。

我正在寻找一种方法来直接通过app实例处理Illuminate\Http\Request的实例,从而阻止真正的http请求。我注意到,这要快得多。然而,将其与https://github.com/amphp/parallel-functions并行化会带来一些问题。

基本代码是这样的:

    wait(parallelMap($urlChunks->all(), function($urls) {
            foreach($urls as $url) {
                //handle the request
            }
        }, $pool));

我尝试了几种变体来处理请求。

1.

$request = \Illuminate\Http\Request::create($url, 'GET');
$response = app()->handle($request);

在这种情况下,app()返回Illuminate\Container\Container的实例,而不是app的实例。所以它没有handle()and等方法。

2.

$request = \Illuminate\Http\Request::create($url, 'GET');
$response = $app->handle($request);

唯一不同的是:变量$app被注入封闭。它的值是来自封闭之外的app()的正确返回值。它是应用程序,但是放大器失败,因为Application实例中包含的PDO连接无法序列化。

3.

$request = \Illuminate\Http\Request::create($url, 'GET');
$app = require __DIR__.'/../../../bootstrap/app.php';
$app->handle($request);

这种方法有一段时间了。但随着应用程序的每个实例化,一个或两个mysql连接开始在状态“睡眠”中徘徊。当脚本结束时,它们才会关闭。重要说明:这与并行化无关。我实际上尝试使用顺序循环,并注意到相同的效果。这看起来像是框架中的一个错误,因为人们应该期望,Application实例会在销毁时关闭所有连接。或者我可以手动执行此操作吗?这将是让这件事发挥作用的一种方法。

有任何想法吗?

laravel laravel-5.4 amphp
1个回答
0
投票

第三个版本是我推荐的方法。 PHP存在时通常会清理PHP中的资源,但这对长时间运行的应用程序不起作用。要改变这种情况,我会在Laravel存储库或任何创建该数据库连接的文件中提出问题。

© www.soinside.com 2019 - 2024. All rights reserved.