我正在使用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实例会在销毁时关闭所有连接。或者我可以手动执行此操作吗?这将是让这件事发挥作用的一种方法。
有任何想法吗?
第三个版本是我推荐的方法。 PHP存在时通常会清理PHP中的资源,但这对长时间运行的应用程序不起作用。要改变这种情况,我会在Laravel存储库或任何创建该数据库连接的文件中提出问题。