我正在使用https://github.com/JosephSilber/page-cache来缓存页面。为了预先准备页面(大约100,000个),我曾经通过GuzzleHttp并行运行8个http请求。它可以工作,但是由于开销而非常慢。
我正在寻找一种直接通过应用实例处理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
的实例,而不是应用程序的实例。因此它没有方法handle()
等等。
2。
$request = \Illuminate\Http\Request::create($url, 'GET');
$response = $app->handle($request);
这里唯一的区别是:变量$app
被注入到闭包中。它的值是app()
在闭包外部调用的正确返回值。它是应用程序,但是amp失败,因为无法序列化Application实例中包含的PDO连接。
3。
$request = \Illuminate\Http\Request::create($url, 'GET');
$app = require __DIR__.'/../../../bootstrap/app.php';
$app->handle($request);
这可以工作一小会儿。但是随着该应用程序的每个实例化,一个或两个mysql连接开始在状态“ Sleep”中徘徊。它们仅在脚本结束时关闭。 重要提示:这与并行化无关。实际上,我在顺序循环中尝试了相同的操作,并注意到了相同的效果。对我来说,这似乎是框架中的错误,因为应该期望,当Application实例被销毁时,它会关闭所有连接。还是可以手动执行此操作?这将是使该功能正常运行的一种方式。
有什么想法吗?
答案 0 :(得分:0)
第三版是我推荐的方法。通常,当PHP存在时,会清理PHP中的资源,但这对于长时间运行的应用程序不起作用。要对此进行更改,我会在Laravel存储库或任何正在创建该数据库连接的文件中提出问题。