Получение ответа от HttpKernel для URL, распараллеленного - PullRequest
0 голосов
/ 04 декабря 2018

Я использую 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 начинают задерживаться в состоянии «Сон».Они закрываются, только когда сценарий заканчивается. Важное замечание: Это не относится к распараллеливанию. Я на самом деле пробовал то же самое с последовательным циклом и заметил тот же эффект.Для меня это выглядит как ошибка в рамках, потому что следует ожидать, что экземпляр приложения закрывает все соединения, когда он разрушается.Или я могу сделать это вручную?Это был бы один из способов заставить эту штуку работать.

Есть идеи?

1 Ответ

0 голосов
/ 04 января 2019

Третья версия - мой рекомендуемый способ сделать это.Ресурсы в PHP обычно очищаются, когда PHP существует, но это не работает для долго работающих приложений.Чтобы изменить это, я бы отправил сообщение о проблеме в репозиторий Laravel или что-то еще, что создает соединение с базой данных.

...