Laravel’de Middleware kullanımı ve yanıt süresini loglama

Aslında sadece yanıt süresini loglamayı anlatıcaktım ama burada işimiz Middleware ile olacağı için onun da ne olduğunu anlatayım istedim. Middleware, kelime anlamıyla, ara katman – orta katman anlamına gelir. Kelime anlamıyla çok uyumlu bir programlama terimi. Bu sefer Laravel’in bir uydurması değil, zaten olan birşey. Bu yazımda Laravel süper isimlendiriyor yawww diye övmeyeceğim. Laravel’de middleware, HTTP istekleri ile isteğin gerçekleşmesi arasında ya da http isteği gerçekleştikten sonra çalışacak şekilde durur. Şöyle ki, Laravel ile yazılmış site.com/hakkimizda sayfasını açmak istediğinizde, Laravel önce router dosyasına bakar, işler ve ilgili controller methodunu çalıştırır. Hah, işte tam bu noktada; router isteği işledikten sonra, controller’a yönlendirmeden önce -eğer tanımlandıysa- middleware sınıfımıza yönlendirir. Middleware çalışır, istenilen kontroller/güncellemeler yapılır, eğer middleware izin verirse controller’a yönlendirilir. (controller’a ne kadar acayip bi kelime ya) Yani middleware, route ile controller arasında bir ARA KATMANdır. Ara katman’ı büyük yazdım çünkü, sadece Laravel’deki kullanımına bakarsak, controller&route arasındaki katman olduğunu zannedebiliriz. Oysa araya girme niyetindeki herşey bir middleware olabilir. Google Translate’teki tanımına bakalım: software that acts as a bridge between an operating system or database and applications, especially on a network. Yani diyor ki, bir işletim sistemi/veritabanı ve uygulamalar arasında köprü görevi gören yazılımlardır. Özellikle bir networkte diye belirtmiş. Bir networkü ben şu şekilde yorumluyorum: bir sistemde/yapıda. Dahili bir biçimde. Neyse çok detaya girip kafa karıştırmayayım, benim kafam karıştı bile. Yine de girmek isteyen olursa katkılarını eklerim.

Laravel’de Middleware

Middleware ile ilgili dökümantasyon şurada bulunuyor: https://laravel.com/docs/master/middleware Laravel 2 tip middleware oluşturmuş. Birincisi, aşina olduğumuz request-controller arası çalışan middleware. Diğeri de response verildikten sonra çalışan terminable middleware. Aşina olduğumuz middleware için şu örneği verebiliriz: Girilen sayfaya, bir kullanıcının yetkisinin olup olmadığını kontrol eden middleware. Kodu ise şu şekildedir:

<?php

    public function handle($request, Closure $next)
    {
       //burada gerekli işlemleri yapıyoruz. örneğin üyenin yetkisi var mı yok mu kontrol edebiliriz.
       //ya da buna benzer şeyler. 

        return $next($request);
    }

$request değişkenimiz, IlluminateHttpRequest sınıfının ta kendisi. Yani bizim o anki isteğimiz ile ilgili herşeyi bilen sınıf. (Bence birisi bu sınıf üzerine bir yazı yazmalı.) O an hangi route çalışıyor, hangi parametreler almış, sessionda neler var, cookiede neler var vs vs gibi onlarca sorunun cevabı bu sınıf içerisinde. Bu bilgiler ışığında istediğiniz kontrolü yapabilirsiniz. Tabi middleware sadece kontrol etmek için kullanılmıyor. Aynı zamanda sisteme yeni parçalar da dahil edebilirsiniz. Herşey sizin elinizde. ### Terminable Middleware

Bu middleware sınıfı, HTTP sonucu, yani Response, tarayıcıya (istemciye) gönderildikten sonra çalışır. Bitiş middlewarelerinde handle methodundan farklı olarak bir de terminate methodu çalışır. Ve bu method $request sınıfına sahip olmakla birlikte, bir de $response sınıfına sahiptir. Response sınıfı sayesinde, istemciye ne sonuç gönderildiğini biliriz ve buna göre istediğimiz işlemi yaparız.

<?php

    public function terminate($request, $response)
    {
        // burada bişeyler yapabiliriz.
        // artık response tarayıcıya gönderildi. 
        // örneğin, responsu kontrol ederiz. diyelim ki 422 sonuç kodu dönüyor.
        // o zaman bunu loglatalım, gibi fantazi işler yapılabilir. 
    }

Laravel’de derleme süresini öğrenme

Laravel’deki <a href="https://github.com/laravel/laravel/blob/master/public/index.php#L10">public/index.php</a> dosyasına baktığımızda, LARAVEL_START adında bir sabit değişken tanımlandığını görürüz. Bu, Laravel’e ilk istek geldiği anda tanımlanır. Yani ilk çalışan kodumuzdur. Şimdi bir de yapmamız gereken, en son çalışma anında süreyi tespit etmek ve aradaki farkı loglara göndermek. Bunun için standart bir middleware oluşturalım. php artisan make:middleware ResponseTimeMiddleware güzel bir başlangıç olacaktır. Daha sonra bu middleware’i AppHttpKernel dosyamızdaki $middleware dizisi içerisine ekleyelim. Böylece tüm requestlerde bu eklediğimiz middleware çalışmış olacak. Yeni oluşturduğumuz middleware’e aşağıdaki terminate fonksiyonunu ekleyelim:

<?php

    ....

    public function terminate(Request $request, Response $response)
    {
        Log::debug($request->getPathInfo().' =>  '.(microtime(true) - LARAVEL_START));
    }

Böylece uygulama başlangıcından itibarek geçen süreyi loglarımıza yazdırmış olduk. Response süresini loglara yazdırıp debug yapmak çok etkili bir yöntem gibi gözükmese de bazen çok hızlı biçimde sorunlu sayfaları bulmanıza yardımcı olabiliyor. Ama ben genelde production ortamında, daha detaylı bilgi veren NewRelic hizmetini kullanıyorum. Hem sayfaların ortalama response sürelerini kolayca öğrenebiliyorum hem de veritabanı sorgularını detaylıca inceleyebiliyorum. Hangi query ne kadar sürmüş vs diye. Tavsiye ederim.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir