大きなデータを取り扱う際に
ControllerとInertia.jsの間でパフォーマンスに問題が発生していた。
データ量を削減することは極めて難しく、最適化を試みても転送サイズが742.55KBとなってしまいました。
データの分散取得と並列処理を検討したのですが、全てのデータが揃わないと作れない画面でしたので、
まずは、MiddlewareでJSONを圧縮することを考えました。
namespace App\Http\Middleware;
class CompressJsonResponse
{
public function handle(
Request $request,
Closure $next
): mixed {
$response = $next($request);
$content = $response->getContent();
if (!is_string($content)) {
return $response;
}
$compressedContent = gzencode($content, 9);
if (!is_string($compressedContent)) {
return $response;
}
$response->setContent($compressedContent);
$response->headers->add(['Content-Encoding' => 'gzip']);
$response->headers->set('Content-Length', (string) strlen($compressedContent));
return $response;
}
}
Kernel
protected $middlewareGroups = [
'compressed' => [
\App\Http\Middleware\CompressJsonResponse::class,
],
];
クソデカJSONを生み出しているRouteにmiddlewareを適用して...
転送サイズ: 34.17KB
小さくなりました。
多段VPN接続をしているので回線速度が遅いのもあるのですが
8秒くらいかかっていたものが、1.6秒になりました。
CDN, Nginx
いつもありがとな!!!!!!