Я использую https://github.com/JosephSilber/page-cache для кэширования страниц.Для предварительной подготовки страниц (около 100 000) я использовал параллельный запуск 8 http-запросов через GuzzleHttp.Это работало, но было довольно медленно из-за накладных расходов.
Я ищу способ обработки экземпляра 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 не удается, потому что соединения PDO, содержащиеся в экземпляре приложения, не могут быть сериализованы.
3.
$request = \Illuminate\Http\Request::create($url, 'GET');
$app = require __DIR__.'/../../../bootstrap/app.php';
$app->handle($request);
Это работает в течение короткого времени.Но с каждым экземпляром приложения одно или два подключения mysql начинают задерживаться в состоянии «Сон».Они закрываются, только когда сценарий заканчивается. Важное замечание: Это не относится к распараллеливанию. Я на самом деле пробовал то же самое с последовательным циклом и заметил тот же эффект.Для меня это выглядит как ошибка в рамках, потому что следует ожидать, что экземпляр приложения закрывает все соединения, когда он разрушается.Или я могу сделать это вручную?Это был бы один из способов заставить эту штуку работать.
Есть идеи?