Giriş yapmadınız.

#1 04.03.2019 11:53:03

aderinkok
Üye
Kayıtlı: 04.03.2019
Mesajlar: 3

Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

Selamünaleyküm,

Boyutu MAX 500kb olan görselleri yükleme işlemi çok uzun sürüyor.(Görseller farklı boyutlarda farklı alanlarda kullanılacağı için boyutunu çözünürlüğü yüksek tutmam gerekiyor.)
Çözüm için;
A - Lazy load denedim ancak çok verimli olmadı.
B- Görsel formatlarını .webp ile değiştirdim. Ancak buda tatmin edecek kadar verimli olmadı ve Safari'de görselleri yüklemiyor.
C- Son olarak Intervention Image Cache (http://image.intervention.io/use/cache) paketini kullandım. Yüklenme süresi olarak rahatlama oldu ancak bu seferde görselleri yeniden boyutlandırmak ve cachelemek için kullandığım route timeout hatası vermeye başladı. Sunucunun ilgili PHP.INI değerleri şu şekilde;

memory_limit = -1 [1 GB]
post_max_size = 64MB

Görselleri cachelemek için kullandığım yöntem ise şu şekilde

1- Görseli yüklendiği View dosyası

<img src="{{resim_helper('/uploads/shares/photos/falan/ornek.jpg,300,200)}}">

2- Helper Dosyası

function resim_helper($giris_resmi,$w=100,$h=100){
return  route('gorsel','?src='.$giris_resmi.'&w='.$w.'&h='.$h);
}

3- Web.php (ilgili route)

    Route::get('gorsel/{q?}', function () {

           if(request()->has('src' )){
               $src = request('src');
                $chk = str_replace('/',DIRECTORY_SEPARATOR,$src);
               $chk = str_replace('uploads','upload',$chk);
                $src = (file_exists(public_path().$chk))?$src:config('app.gorselYok');
           }else{
               $src = config('app.gorselYok');
           }
        if(request()->has('w')){
            $w = request('w');
        }else{
            $w = 100;
        }
        if(request()->has('h')){
            $h = request('h');
        }else{
            $h = 100;
        }

        $cacheImage = Image::cache(function ($image) use ($src,$w,$h) {
            return $image->make(url($src))->resize($w,$h, function ($constraint) {
                $constraint->aspectRatio();
                $constraint->upsize();
            });
        }, 10);
        return Response::make($cacheImage,200,array('Content-Type'=>'image/jpeg'))
            ->setMaxAge(604800) //seconds
            ->setPublic();
    })->name('gorsel');

Yukarıda bahsettiğim A ve B yöntemlerini eledim. C yöntemi ise bana mantıklı geliyor ancak bahsettiğim gibi timeout hatası ile  ( This request takes too long to process, it is timed out by the server. If it should not be timed out, please contact administrator of this web site to increase 'Connection Timeout") karşılaşıyorum. Bu sorunun çözümü için önerileniz var mı yada kullandığım bu yöntem sağlıklı mı ne tavsiye edersiniz ?

Çevrimdışı

#2 04.03.2019 14:13:16

ak
Üye
Yer: İstanbul
Kayıtlı: 12.07.2014
Mesajlar: 123

Yanıt: Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

Merhaba,

Dinamik boyutlandırma yerine resim eklendiğinde farklı seçenekler(thumb, small, big vb.) oluşturulabilir.

https://github.com/spatie/laravel-medialibrary
https://docs.spatie.be/laravel-medialib … onversions
inceler misiniz.

Çevrimdışı

#3 04.03.2019 14:30:35

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,537
Website

Yanıt: Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

Öncelikle bu yaptığınız sistemde URL saldırısı atağına karşı koruma yok sanırım. Yani biri ?src=...&w=100&h=100 şeklindeki URL'de w ve h değişkenlerini modifiye edip sunucuzda yer bırakmayıncaya kadar önbellek oluşturabilir.

Bu şekilde yapmak istiyorsanız daha önce şu paketi kullanmıştım. Bunda URL güvenliği mevcut:
https://github.com/thephpleague/glide

ama @ak arkadaşın tavsiye ettiği gibi ben de spatie/laravel-medialibrary kullanıyorum. MySQL sürümünüz 5.7+ ise kesinlikle tavsiye ederim.

Çevrimdışı

#4 04.03.2019 16:24:03

aderinkok
Üye
Kayıtlı: 04.03.2019
Mesajlar: 3

Yanıt: Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

@ak,@mgsmus önerileriniz için teşekkürler. Görsel işleme konusunda farklı alternatifler belirtmişsiniz. https://github.com/thephpleague/glide bu pakette görsel görüntüleme yaparken .cache klasörü içinde dosya oluşturuyor. https://github.com/thephpleague/glide için cache durumu söz konusu değil sanırım.

Mevcut kullandığım yapıda karşılaştığım Timeout hatası ile ilgili  yorumunuz veya çözümünüz nedir ? Burada benim yaşadığım temel sorun sürekli siteyi ziyaret eden kullanıcıların aynı görselleri her defasında yüklenmesini beklemesi. "...com/gorsel?src=x.jpg&w=100'&h=100 şeklinde çağrılan bir görselin gecikmesine neden olan sebep ne olabilir?

Ek Soru : İstemci tarafında yüklenen görselin "(from disk cache)" olarak gelmesini sağlamak (istemci tarayıcıda cache  özelliğini kapatmamışsa) için 

Response::make($cacheImage,200,array('Content-Type'=>'image/jpeg'))
            ->setMaxAge(604800) //seconds
            ->setPublic();

yapısını kullanıyorum şu anda. Ancak sitenin logosuna hiçbir müdahelede bulunmadığım halde cache'den yükleniyor. Bu neye göre belirleniyor ve tüm görselleri otomatik olarak görsel logo örneğinde olduğu gibi cache sistemine dahil etmek için ne yapmak gerekir? Mümkün mü böyle birşey sunucu tarafında?

Çevrimdışı

#5 04.03.2019 17:32:06

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,537
Website

Yanıt: Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

Yapmanız gereken önbellekteki resmi fiziksel dosyaya çevirmek ve o varsa önbellek yerine onu servis etmek. Önbellekten getirme fiziksel dosya getirmeden elbette daha yavaş olacaktır, birinde framework yükleniyor diğerinde sadece fiziksel dosya servis ediliyor.

Çevrimdışı

#6 04.03.2019 21:22:47

aderinkok
Üye
Kayıtlı: 04.03.2019
Mesajlar: 3

Yanıt: Görselleri cache'leyerek yüklenme süresini kısaltma [Sorun]

@mgsmus ve @ak ilgiliniz için teşekkür ederim.

Aynı sorunu yaşayan arkadaşlar için https://github.com/thephpleague/glide yardımı ile sorunumu çözdüm hem yüklenme süresi hem de cacheleme olayını hallettim.

Çevrimdışı

Forum alt kısmı